blob: cef131a3b79c0a2a9a7d3052ae71c2fe9f8f47d6 [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
26#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060027#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30
31#include <iostream>
32#include <string>
33#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050034#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060035#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060036#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060038#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070039#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060040#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041#include "vk_enum_validate_helper.h"
42#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060043
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_table.h"
45#include "vk_layer_data.h"
46#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060047#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070048#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060049
Dustin Graves8ffbbf62016-07-22 13:19:46 -060050#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060051#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070052
Chia-I Wu1a6b1932016-05-13 14:07:36 +080053namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060054
Cody Northrop55443ef2015-09-28 15:09:32 -060055struct layer_data {
Chia-I Wua570b7c2016-05-16 07:48:14 +080056 VkInstance instance;
57
Jeremy Hayes99a96322015-06-26 12:48:09 -060058 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070059 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060060
Ian Elliotted6b5ac2016-04-28 09:08:13 -060061 // The following are for keeping track of the temporary callbacks that can
62 // be used in vkCreateInstance and vkDestroyInstance:
63 uint32_t num_tmp_callbacks;
64 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
65 VkDebugReportCallbackEXT *tmp_callbacks;
66
Jon Ashburn5484e0c2016-03-08 17:48:44 -070067 // TODO: Split instance/device structs
68 // Device Data
69 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060070 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Mark Lobodzinskia4932512016-06-27 15:13:00 -060071 VkPhysicalDeviceLimits device_limits;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060072 VkPhysicalDeviceFeatures physical_device_features;
73 VkPhysicalDevice physical_device;
Michael Lentinebdf744f2016-01-27 15:43:43 -060074
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060075 bool wsi_enabled;
Mark Youngead9b932016-09-08 12:28:38 -060076 bool wsi_display_swapchain_enabled;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060077
Mark Lobodzinskia4932512016-06-27 15:13:00 -060078 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060079 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
Mark Youngead9b932016-09-08 12:28:38 -060080 physical_device_features{}, physical_device{}, wsi_enabled(false), wsi_display_swapchain_enabled(false) {};
Cody Northrop55443ef2015-09-28 15:09:32 -060081};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050082
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060083static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070084static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060085static device_table_map pc_device_table_map;
86static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060087
Jeremy Hayes99a96322015-06-26 12:48:09 -060088// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070089debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060090 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060091 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060092#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060093 fprintf(stderr, "MID: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060094#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060095 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060096
97 return data->report_data;
98}
99
100// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700101debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102 dispatch_key key = get_dispatch_key(object);
103 layer_data *data = get_my_data_ptr(key, layer_data_map);
104#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -0600105 fprintf(stderr, "MDD: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600106#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -0600107 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600108 return data->report_data;
109}
110
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600111static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600112
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600113 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600114}
115
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600116VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
117 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
118 const VkAllocationCallbacks *pAllocator,
119 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700120 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700121 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600122
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700123 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700124 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600125 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600126 }
127
128 return result;
129}
130
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600131VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800132 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700133 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700134 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600135
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700136 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700137 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600138}
139
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600140VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
141 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
142 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700143 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
144 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700145}
146
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700147static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600148
Chia-I Wu3384db82016-05-16 07:30:58 +0800149static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600150 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800151};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700152
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600154 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
156 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
157 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
158 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
159 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 -0700160 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 return false;
163 }
164
165 return true;
166}
167
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700168static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
169 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 return "unrecognized enumerator";
171 }
172
173 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700174 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600175 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
176 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700177 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600178 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
179 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700180 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600181 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
182 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700183 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600184 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
185 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700186 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600187 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
188 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700189 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600190 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
191 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700192 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600193 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
194 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700195 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600196 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
197 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700198 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600199 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
200 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700201 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600202 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
203 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700204 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800205 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600206 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700207 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800208 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600209 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700210 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700211 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
212 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600213
214 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700215 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600216 enumeratorString += string;
217
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600219 enumeratorString += '|';
220 }
221 }
222
223 return enumeratorString;
224}
225
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700226static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
227 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
228 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
229 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
230 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
231 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 return false;
233 }
234
235 return true;
236}
237
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700238static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
239 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600240 return "unrecognized enumerator";
241 }
242
243 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600245 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
246 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700247 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600248 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700250 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600251 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
252 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700253 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600254 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
255 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600257 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
258 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700259 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800260 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600261 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
264 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700265 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800266 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600267 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600268
269 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700270 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600271 enumeratorString += string;
272
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700273 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600274 enumeratorString += '|';
275 }
276 }
277
278 return enumeratorString;
279}
280
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
282 VkQueueFlagBits allFlags =
283 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
284 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600285 return false;
286 }
287
288 return true;
289}
290
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700291static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
292 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600293 return "unrecognized enumerator";
294 }
295
296 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700297 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800298 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600299 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700300 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600301 strings.push_back("VK_QUEUE_COMPUTE_BIT");
302 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700303 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800304 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700306 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600307 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
308 }
309
310 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700311 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600312 enumeratorString += string;
313
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600315 enumeratorString += '|';
316 }
317 }
318
319 return enumeratorString;
320}
321
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700322static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
323 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
324 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
325 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
326 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600327 return false;
328 }
329
330 return true;
331}
332
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700333static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
334 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600335 return "unrecognized enumerator";
336 }
337
338 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700339 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600340 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
341 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700342 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800343 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600344 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700345 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600346 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
347 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700348 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800349 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600350 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700351 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800352 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600353 }
354
355 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600357 enumeratorString += string;
358
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700359 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600360 enumeratorString += '|';
361 }
362 }
363
364 return enumeratorString;
365}
366
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700367static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700368 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700369 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600370 return false;
371 }
372
373 return true;
374}
375
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700376static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
377 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600378 return "unrecognized enumerator";
379 }
380
381 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700382 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800383 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600384 }
385
386 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700387 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600388 enumeratorString += string;
389
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700390 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600391 enumeratorString += '|';
392 }
393 }
394
395 return enumeratorString;
396}
397
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700398static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
399 VkSparseImageFormatFlagBits allFlags =
400 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
401 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
402 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600403 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600404 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405
406 return true;
407}
408
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700409static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
410 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600413
414 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700415 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800416 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600417 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700418 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800419 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600420 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800422 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600423 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600424
425 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700426 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600427 enumeratorString += string;
428
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700429 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600430 enumeratorString += '|';
431 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600432 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600433
434 return enumeratorString;
435}
436
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700437static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700438 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700439 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600440 return false;
441 }
442
443 return true;
444}
445
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700446static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
447 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600448 return "unrecognized enumerator";
449 }
450
451 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700452 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600453 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
454 }
455
456 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700457 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600458 enumeratorString += string;
459
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700460 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600461 enumeratorString += '|';
462 }
463 }
464
465 return enumeratorString;
466}
467
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700468static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
469 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
470 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
471 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
472 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
473 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600474 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
475 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
476 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 return false;
479 }
480
481 return true;
482}
483
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700484static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
485 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600486 return "unrecognized enumerator";
487 }
488
489 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700490 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700491 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600492 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700493 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700494 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700496 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700497 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600498 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700499 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700500 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600501 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700502 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700503 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600504 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700505 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700506 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600507 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700508 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700509 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600510 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700511 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700512 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600513 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700514 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700515 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600516 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700517 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700518 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600519 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700520 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700521 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600522 }
523
524 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700525 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600526 enumeratorString += string;
527
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700528 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600529 enumeratorString += '|';
530 }
531 }
532
533 return enumeratorString;
534}
535
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
537 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
538 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
539 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 return false;
541 }
542
543 return true;
544}
545
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700546static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
547 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600548 return "unrecognized enumerator";
549 }
550
551 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700552 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600553 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
554 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700555 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600556 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
557 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700558 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600559 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
560 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700561 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600562 strings.push_back("VK_QUERY_RESULT_64_BIT");
563 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600564
565 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700566 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600567 enumeratorString += string;
568
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600570 enumeratorString += '|';
571 }
572 }
573
574 return enumeratorString;
575}
576
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700577static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
578 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
579 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
580 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
581 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
582 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 return false;
584 }
585
586 return true;
587}
588
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700589static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
590 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600591 return "unrecognized enumerator";
592 }
593
594 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700595 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600596 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
597 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700598 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600599 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
600 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700601 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
603 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700604 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600605 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
606 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
609 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700610 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800611 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600612 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700613 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
615 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700616 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800617 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600618 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700619 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
621 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600622
623 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700624 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600625 enumeratorString += string;
626
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700627 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600628 enumeratorString += '|';
629 }
630 }
631
632 return enumeratorString;
633}
634
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700635static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
636 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
637 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
638 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639 return false;
640 }
641
642 return true;
643}
644
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700645static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
646 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600647 return "unrecognized enumerator";
648 }
649
650 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700651 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600652 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
653 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700654 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600655 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
656 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700657 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600658 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600659 }
660
661 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700662 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600663 enumeratorString += string;
664
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700665 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600666 enumeratorString += '|';
667 }
668 }
669
670 return enumeratorString;
671}
672
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700673static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
674 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
675 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
676 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
677 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 return false;
679 }
680
681 return true;
682}
683
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700684static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
685 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686 return "unrecognized enumerator";
687 }
688
689 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700690 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600691 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
692 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700693 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600694 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
695 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700696 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600697 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
698 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700699 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
701 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700702 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600703 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600704 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600705
706 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700707 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600708 enumeratorString += string;
709
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700710 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600711 enumeratorString += '|';
712 }
713 }
714
715 return enumeratorString;
716}
717
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
719 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
720 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
721 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600722 return false;
723 }
724
725 return true;
726}
727
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700728static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
729 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600730 return "unrecognized enumerator";
731 }
732
733 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700734 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800735 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600736 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700737 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800738 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600739 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700740 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800741 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600742 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700743 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800744 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600745 }
746
747 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700748 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600749 enumeratorString += string;
750
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700751 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600752 enumeratorString += '|';
753 }
754 }
755
756 return enumeratorString;
757}
758
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700759static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
760 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
761 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
762 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600763 return false;
764 }
765
766 return true;
767}
768
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700769static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
770 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600771 return "unrecognized enumerator";
772 }
773
774 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700775 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600776 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
777 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700778 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600779 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
780 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700781 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600782 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600783 }
784
785 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700786 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600787 enumeratorString += string;
788
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600790 enumeratorString += '|';
791 }
792 }
793
794 return enumeratorString;
795}
796
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700797static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
798 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
799 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
800 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
801 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600802 return false;
803 }
804
805 return true;
806}
807
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700808static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
809 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600810 return "unrecognized enumerator";
811 }
812
813 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700814 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600815 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600816 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700817 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600818 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600819 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700820 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600821 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
822 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700823 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600824 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
825 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700826 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600827 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600828 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600830 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600831 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700832 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600833 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600834 }
835
836 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700837 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600838 enumeratorString += string;
839
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700840 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600841 enumeratorString += '|';
842 }
843 }
844
845 return enumeratorString;
846}
847
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800849 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700850 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
851 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
852 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
853 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
854 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
855 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 -0700856 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600858 return false;
859 }
860
861 return true;
862}
863
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700864static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
865 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600866 return "unrecognized enumerator";
867 }
868
869 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700870 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800871 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
872 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700873 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800874 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600875 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700876 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600877 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600878 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700879 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600880 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600881 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700882 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600883 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600884 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700885 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700886 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600887 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700888 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600889 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600890 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700891 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600892 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600893 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700894 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600895 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600896 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700897 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600898 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600899 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700900 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600901 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
902 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700903 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600904 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
905 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700906 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700907 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600908 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700909 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600910 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
911 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700912 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600913 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
914 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700915 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600916 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
917 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700918 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600919 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600920 }
921
922 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700923 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600924 enumeratorString += string;
925
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700926 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600927 enumeratorString += '|';
928 }
929 }
930
931 return enumeratorString;
932}
933
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700934static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800935 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700936 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
937 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
938 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
939 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
940 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 +0800941
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700942 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600943 return false;
944 }
945
946 return true;
947}
948
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700949static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
950 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600951 return "unrecognized enumerator";
952 }
953
954 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700955 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800956 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600957 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700958 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800959 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600960 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700961 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800962 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600963 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700964 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800965 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600966 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700967 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800968 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600969 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700970 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800971 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600972 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700973 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800974 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600975 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700976 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800977 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600978 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700979 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800980 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600981 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700982 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800983 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600984 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700985 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800986 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600987 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700988 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800989 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600990 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700991 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800992 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600993 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700994 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800995 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600996 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700997 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800998 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600999 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001000 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001001 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001002 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001003 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001004 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001005 }
1006
1007 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001009 enumeratorString += string;
1010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001011 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001012 enumeratorString += '|';
1013 }
1014 }
1015
1016 return enumeratorString;
1017}
1018
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001019static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1020 VkCommandPoolCreateFlagBits allFlags =
1021 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1022 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001023 return false;
1024 }
1025
1026 return true;
1027}
1028
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001029static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1030 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001031 return "unrecognized enumerator";
1032 }
1033
1034 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001035 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001036 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001037 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001038 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001039 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001040 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001041
1042 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001044 enumeratorString += string;
1045
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001046 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001047 enumeratorString += '|';
1048 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001049 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001050
1051 return enumeratorString;
1052}
1053
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001054static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001055 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001056 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001057 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001058 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001059
1060 return true;
1061}
1062
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001063static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1064 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001065 return "unrecognized enumerator";
1066 }
1067
1068 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001069 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001070 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001071 }
1072
1073 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001074 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001075 enumeratorString += string;
1076
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001077 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001078 enumeratorString += '|';
1079 }
1080 }
1081
1082 return enumeratorString;
1083}
1084
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001085static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1086 VkCommandBufferUsageFlags allFlags =
1087 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1088 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1089 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001090 return false;
1091 }
1092
1093 return true;
1094}
1095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001096static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1097 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001098 return "unrecognized enumerator";
1099 }
1100
1101 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001102 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001103 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001104 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001105 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001106 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001109 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001110 }
1111
1112 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001113 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001114 enumeratorString += string;
1115
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001116 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001117 enumeratorString += '|';
1118 }
1119 }
1120
1121 return enumeratorString;
1122}
1123
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001124static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001125 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001126 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001127 return false;
1128 }
1129
1130 return true;
1131}
1132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001133static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1134 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001135 return "unrecognized enumerator";
1136 }
1137
1138 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001139 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001140 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001141 }
1142
1143 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001144 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001145 enumeratorString += string;
1146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001147 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001148 enumeratorString += '|';
1149 }
1150 }
1151
1152 return enumeratorString;
1153}
1154
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1156 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1157 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1158 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001159 return false;
1160 }
1161
1162 return true;
1163}
1164
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001165static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1166 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001167 return "unrecognized enumerator";
1168 }
1169
1170 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001171 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001172 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1173 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001174 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001175 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1176 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001177 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001178 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1179 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001180 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001181 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1182 }
1183
1184 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001186 enumeratorString += string;
1187
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001188 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001189 enumeratorString += '|';
1190 }
1191 }
1192
1193 return enumeratorString;
1194}
1195
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001196static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001197 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001198 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001199 return false;
1200 }
1201
1202 return true;
1203}
1204
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001205static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1206 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001207 return "unrecognized enumerator";
1208 }
1209
1210 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001211 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001212 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001213 }
1214
1215 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001216 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001217 enumeratorString += string;
1218
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001219 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001220 enumeratorString += '|';
1221 }
1222 }
1223
1224 return enumeratorString;
1225}
1226
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001227static const int MaxParamCheckerStringLength = 256;
1228
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001229static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001230 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001231 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001232 assert(validateString != nullptr);
1233
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001234 bool skip_call = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001235
1236 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1237
1238 if (result == VK_STRING_ERROR_NONE) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001239 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001240 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001241
1242 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1243 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1244 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001245 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001246 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1247 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1248 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001249 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001250 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001251}
1252
Dustin Gravesde628532016-04-21 16:30:17 -06001253static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1254 uint32_t index) {
1255 assert(device_data != nullptr);
1256 debug_report_data *report_data = device_data->report_data;
1257 bool skip_call = false;
1258
1259 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001260 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1261 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001262 } else {
1263 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1264 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1265 skip_call |= 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) must be one of the indices specified when the device was created, via "
1267 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001268 function_name, parameter_name, index);
1269 return false;
1270 }
1271 }
1272
1273 return skip_call;
1274}
1275
1276static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1277 const uint32_t count, const uint32_t *indices) {
1278 assert(device_data != nullptr);
1279 debug_report_data *report_data = device_data->report_data;
1280 bool skip_call = false;
1281
1282 if (indices != nullptr) {
1283 for (uint32_t i = 0; i < count; i++) {
1284 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001285 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1286 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001287 } else {
1288 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1289 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1290 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001291 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1292 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001293 function_name, parameter_name, i, indices[i]);
1294 return false;
1295 }
1296 }
1297 }
1298 }
1299
1300 return skip_call;
1301}
1302
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001303static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001305VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1306 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001307 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001308
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001309 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001310 assert(chain_info != nullptr);
1311 assert(chain_info->u.pLayerInfo != nullptr);
1312
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001313 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1314 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001315 if (fpCreateInstance == NULL) {
1316 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001317 }
1318
Dustin Graves842621d2016-03-03 14:17:08 -07001319 // Advance the link info for the next element on the chain
1320 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1321
1322 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001323
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001324 if (result == VK_SUCCESS) {
1325 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1326 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001327
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001328 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001329
Chia-I Wua570b7c2016-05-16 07:48:14 +08001330 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001331 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1332 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001333
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001334 // Look for one or more debug report create info structures
1335 // and setup a callback(s) for each one found.
1336 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1337 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1338 if (my_instance_data->num_tmp_callbacks > 0) {
1339 // Setup the temporary callback(s) here to catch early issues:
1340 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1341 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1342 // Failure of setting up one or more of the callback.
1343 // Therefore, clean up and don't use those callbacks:
1344 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1345 my_instance_data->num_tmp_callbacks = 0;
1346 }
1347 }
1348 }
1349
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001350 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001351 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001352
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001353 // Ordinarily we'd check these before calling down the chain, but none of the layer
1354 // support is in place until now, if we survive we can report the issue now.
1355 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001356
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001357 if (pCreateInfo->pApplicationInfo) {
1358 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1359 validate_string(my_instance_data->report_data, "vkCreateInstance",
1360 "pCreateInfo->VkApplicationInfo->pApplicationName",
1361 pCreateInfo->pApplicationInfo->pApplicationName);
1362 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001363
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001364 if (pCreateInfo->pApplicationInfo->pEngineName) {
1365 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1366 pCreateInfo->pApplicationInfo->pEngineName);
1367 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001368 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001369
1370 // Disable the tmp callbacks:
1371 if (my_instance_data->num_tmp_callbacks > 0) {
1372 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1373 my_instance_data->tmp_callbacks);
1374 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001375 }
1376
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001377 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001378}
1379
Chia-I Wu01ca2372016-05-13 14:37:49 +08001380VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001381 // Grab the key before the instance is destroyed.
1382 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001383 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001384 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001385 assert(my_data != NULL);
1386
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001387 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1388 bool callback_setup = false;
1389 if (my_data->num_tmp_callbacks > 0) {
1390 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1391 my_data->tmp_callbacks)) {
1392 callback_setup = true;
1393 }
1394 }
1395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001396 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001397
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001398 // Disable and cleanup the temporary callback(s):
1399 if (callback_setup) {
1400 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1401 }
1402 if (my_data->num_tmp_callbacks > 0) {
1403 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1404 my_data->num_tmp_callbacks = 0;
1405 }
1406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001407 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001409 pTable->DestroyInstance(instance, pAllocator);
1410
1411 // Clean up logging callback, if any
1412 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001413 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1414 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001415 my_data->logging_callback.pop_back();
1416 }
1417
1418 layer_debug_report_destroy_instance(mid(instance));
1419 layer_data_map.erase(pTable);
1420
1421 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001422 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001423 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001424}
1425
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001426VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1427 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001428 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001429 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001430 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001431 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001432
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001433 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001435 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001436 result = get_dispatch_table(pc_instance_table_map, instance)
1437 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001438
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001439 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001440 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1441 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1442 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1443 // Save the supported features for each physical device
1444 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1445 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1446 }
1447 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001448 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001449 return result;
1450}
1451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001452VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1453 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001455 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001456
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001457 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001459 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001460 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001461 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001462}
1463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001464VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1465 VkFormatProperties *pFormatProperties) {
1466 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001470 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001472 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001473 get_dispatch_table(pc_instance_table_map, physicalDevice)
1474 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001475 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001476}
1477
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001478VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1479 VkImageType type, VkImageTiling tiling,
1480 VkImageUsageFlags usage, VkImageCreateFlags flags,
1481 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001482 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001483 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001484 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001486
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001487 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1488 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001490 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001491 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1492 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1493 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001494
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001495 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496 }
Chia-I Wu17241042015-10-31 00:31:16 +08001497
1498 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001499}
1500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001501VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1502 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001503 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001505
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001506 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001508 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001509 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001510 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001511}
1512
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001513VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1514 uint32_t *pQueueFamilyPropertyCount,
1515 VkQueueFamilyProperties *pQueueFamilyProperties) {
1516 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001517 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001518 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001519
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001520 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1521 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001523 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001524 get_dispatch_table(pc_instance_table_map, physicalDevice)
1525 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001526 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001527}
1528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001529VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1530 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1531 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001532 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001533 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001534
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001535 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001536
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001537 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001538 get_dispatch_table(pc_instance_table_map, physicalDevice)
1539 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001540 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001541}
1542
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001543void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1544 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001545 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001546
1547 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1548 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1549 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001550 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001551 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001552 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1553 "structure.",
1554 i);
1555 } else {
1556 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001557 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001558
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001559 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1560 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1561 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1562 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001563 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001564 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001565 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1566 "between 0 and 1. Actual value is %f",
1567 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1568 }
1569 }
1570 }
1571
1572 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1573 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001574 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001575 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001576 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1577 "of queue families.",
1578 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001579 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1580 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1581 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001582 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001583 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001584 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1585 "queues for the given family index.",
1586 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001587 }
Michael Lentine774704f2016-01-27 13:36:46 -06001588 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001589 }
1590}
1591
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001592static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001593 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001594
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001595 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001596
1597 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1598 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001599 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001600 }
1601#ifdef VK_USE_PLATFORM_XLIB_KHR
1602 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001603 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001604 }
1605#endif
1606#ifdef VK_USE_PLATFORM_XCB_KHR
1607 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001608 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001609 }
1610#endif
1611#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1612 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001613 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001614 }
1615#endif
1616#ifdef VK_USE_PLATFORM_MIR_KHR
1617 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001618 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001619 }
1620#endif
1621#ifdef VK_USE_PLATFORM_ANDROID_KHR
1622 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001623 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001624 }
1625#endif
1626#ifdef VK_USE_PLATFORM_WIN32_KHR
1627 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001628 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001629 }
1630#endif
1631 }
1632}
1633
1634static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1635 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1636 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06001637 device_data->wsi_display_swapchain_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001638
1639 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1640 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1641 device_data->wsi_enabled = true;
1642 }
Mark Youngead9b932016-09-08 12:28:38 -06001643 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
1644 device_data->wsi_display_swapchain_enabled = true;
1645 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001646 }
1647}
1648
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001649void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001650 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001651
1652 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1653 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1654 my_device_data->queueFamilyIndexMap.insert(
1655 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1656 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001657 }
1658}
1659
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001660VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001661 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001662 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001663 * NOTE: We do not validate physicalDevice or any dispatchable
1664 * object as the first parameter. We couldn't get here if it was wrong!
1665 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001666
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001667 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001668 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001669 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001670 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001672 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001673
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001674 if (pCreateInfo != NULL) {
1675 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001676 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001677 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1678 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001679 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001680 }
Michael Lentine774704f2016-01-27 13:36:46 -06001681
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001682 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001683 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001684 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1685 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001686 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001687 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001688 }
1689
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001690 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001691 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001692 assert(chain_info != nullptr);
1693 assert(chain_info->u.pLayerInfo != nullptr);
1694
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001695 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1696 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001697 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001698 if (fpCreateDevice == NULL) {
1699 return VK_ERROR_INITIALIZATION_FAILED;
1700 }
1701
1702 // Advance the link info for the next element on the chain
1703 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1704
1705 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001706
1707 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1708
1709 if (result == VK_SUCCESS) {
1710 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1711 assert(my_device_data != nullptr);
1712
1713 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1714 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1715
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001716 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1717
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001718 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001719 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1720 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001721 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001722 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001723
1724 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1725 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001726
1727 // Query and save physical device limits for this device
1728 VkPhysicalDeviceProperties device_properties = {};
1729 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1730 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001731 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001732
1733 // Save app-enabled features in this device's layer_data structure
1734 if (pCreateInfo->pEnabledFeatures) {
1735 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1736 } else {
1737 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1738 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001739 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001740 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001741
Jeremy Hayes99a96322015-06-26 12:48:09 -06001742 return result;
1743}
1744
Chia-I Wu01ca2372016-05-13 14:37:49 +08001745VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001746 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001747 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001748 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1749 assert(my_data != NULL);
1750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001751 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001753 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001754 layer_debug_report_destroy_device(device);
1755
Jeremy Hayes99a96322015-06-26 12:48:09 -06001756#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001757 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758#endif
1759
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001760 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001761 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001762 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001763 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764}
1765
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001766bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001767 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001768 assert(my_device_data != nullptr);
1769
Dustin Gravesde628532016-04-21 16:30:17 -06001770 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001771
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001772 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001773 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001774 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001775 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001776 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1777 "was created.",
1778 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001779 return false;
1780 }
1781 return true;
1782}
1783
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001784VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1785 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001787 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001789 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001791 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001792 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1793
1794 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001795 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001796}
1797
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001798VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001799 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001800 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001801 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001802 assert(my_data != NULL);
1803
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001804 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001805
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001806 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001807 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1808
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001809 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001810 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001811
Jeremy Hayes99a96322015-06-26 12:48:09 -06001812 return result;
1813}
1814
Chia-I Wu01ca2372016-05-13 14:37:49 +08001815VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001816 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1817 assert(my_data != NULL);
1818
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001819 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001820
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001821 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001822
1823 return result;
1824}
1825
Chia-I Wu01ca2372016-05-13 14:37:49 +08001826VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1828 assert(my_data != NULL);
1829
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001830 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001831
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001832 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001833
1834 return result;
1835}
1836
Chia-I Wu01ca2372016-05-13 14:37:49 +08001837VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001838 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001840 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001843
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001844 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001845
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001846 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1848
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001849 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001851
1852 return result;
1853}
1854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001855VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1856 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001857 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001858 assert(my_data != NULL);
1859
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001860 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001861
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001862 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001863 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001864 }
1865}
1866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001867VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1868 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001870 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001873
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001874 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001875
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001876 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1878
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001879 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001881
1882 return result;
1883}
1884
Chia-I Wu01ca2372016-05-13 14:37:49 +08001885VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001886 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001887 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1888 assert(my_data != NULL);
1889
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001890 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001892 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001893 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1894 }
1895}
1896
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001897VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1898 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001899 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001900 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001901 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001902 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001904 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001905
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001906 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1908
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001909 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001910 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001911
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001912 return result;
1913}
1914
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001915VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1916 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001917 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001918 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001919 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001921
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001922 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001923
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001924 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001925 result =
1926 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001928 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001929 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001930
Tony Barbourb1250542015-04-16 19:23:13 -06001931 return result;
1932}
1933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001934VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1935 VkDeviceSize *pCommittedMemoryInBytes) {
1936 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001937 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001938 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001939
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001940 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001941
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001942 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001943 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001944 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001945}
1946
Chia-I Wu01ca2372016-05-13 14:37:49 +08001947VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1948 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001949 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001950 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001951 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1952 assert(my_data != NULL);
1953
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001954 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001955
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001956 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001957 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1958
1959 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1960 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001961
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001962 return result;
1963}
1964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001965VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001966 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001967 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1969 assert(my_data != NULL);
1970
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001971 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001972
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001973 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001974 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1975
1976 validate_result(my_data->report_data, "vkBindImageMemory", result);
1977 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001978
1979 return result;
1980}
1981
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001982VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1983 VkMemoryRequirements *pMemoryRequirements) {
1984 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001988 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001990 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001991 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001992 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001993}
1994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001995VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1996 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001997 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001998 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001999
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002000 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002002 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002003 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002004 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002005}
2006
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002007bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2008 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2009 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002010 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002011 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2012 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002013 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002014 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002015 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2016 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002017 return false;
2018 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002019 }
2020
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002021 return true;
2022}
2023
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002024VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2025 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2026 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002027 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002028 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002029
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002030 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2031 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002032
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002033 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034 get_dispatch_table(pc_device_table_map, device)
2035 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002036
2037 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2038 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002039}
2040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002041bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2042 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2043 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044 if (pProperties != nullptr) {
2045 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2046 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002047 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002048 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002049 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2050 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002051 return false;
2052 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002053 }
2054
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002055 return true;
2056}
2057
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002058VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2059 VkImageType type, VkSampleCountFlagBits samples,
2060 VkImageUsageFlags usage, VkImageTiling tiling,
2061 uint32_t *pPropertyCount,
2062 VkSparseImageFormatProperties *pProperties) {
2063 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002064 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002065 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002066
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002067 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2068 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002070 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002071 get_dispatch_table(pc_instance_table_map, physicalDevice)
2072 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2073 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002075 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2076 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002077 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002078}
2079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002080VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2081 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002082 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002083 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002084 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002085 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002087 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002089 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002090 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2091
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002092 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002093 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002094
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002095 return result;
2096}
2097
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002098VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2099 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002101 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002102 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002103 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002105 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002107 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2109
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002110 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002111 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002112
2113 return result;
2114}
2115
Chia-I Wu01ca2372016-05-13 14:37:49 +08002116VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002117 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002118 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002119 assert(my_data != NULL);
2120
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002121 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002122
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002123 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002124 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002125 }
2126}
2127
Chia-I Wu01ca2372016-05-13 14:37:49 +08002128VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002129 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002130 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002131 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002132 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002133
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002134 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002136 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002137 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2138
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002139 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002140 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002141
2142 return result;
2143}
2144
Chia-I Wu01ca2372016-05-13 14:37:49 +08002145VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002146 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002147 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2149 assert(my_data != NULL);
2150
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002151 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002153 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002154 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2155
2156 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2157 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002158
2159 return result;
2160}
2161
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002162VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2163 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002164 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002165 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002167 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002168
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002169 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002171 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002172 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2173
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002174 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002175 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002176
2177 return result;
2178}
2179
Chia-I Wu01ca2372016-05-13 14:37:49 +08002180VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002181 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002183 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002185 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002186
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002187 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002188
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002189 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002190 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2191
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002192 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002193 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002194
2195 return result;
2196}
2197
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002198VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2199 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002201 assert(my_data != NULL);
2202
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002203 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002205 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002206 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002207 }
2208}
2209
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002210VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2211 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002212 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002213 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002214 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002215 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002216
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002217 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002218
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002219 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002220 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2221
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002222 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002224
2225 return result;
2226}
2227
Chia-I Wu01ca2372016-05-13 14:37:49 +08002228VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002229 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002231 assert(my_data != NULL);
2232
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002233 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002235 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002236 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002237 }
2238}
2239
Chia-I Wu01ca2372016-05-13 14:37:49 +08002240VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002241 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002242 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002243 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2244 assert(my_data != NULL);
2245
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002246 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002247
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002248 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002249 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2250
2251 validate_result(my_data->report_data, "vkGetEventStatus", result);
2252 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002253
2254 return result;
2255}
2256
Chia-I Wu01ca2372016-05-13 14:37:49 +08002257VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002258 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002259 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2261 assert(my_data != NULL);
2262
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002263 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002264
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002265 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002266 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2267
2268 validate_result(my_data->report_data, "vkSetEvent", result);
2269 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002270
2271 return result;
2272}
2273
Chia-I Wu01ca2372016-05-13 14:37:49 +08002274VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002275 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002276 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002277 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2278 assert(my_data != NULL);
2279
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002280 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002281
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002282 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002283 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2284
2285 validate_result(my_data->report_data, "vkResetEvent", result);
2286 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002287
2288 return result;
2289}
2290
Chia-I Wu01ca2372016-05-13 14:37:49 +08002291VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002292 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002293 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002294 bool skip_call = false;
2295 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2296 assert(device_data != nullptr);
2297 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002298
Dustin Gravesc900f572016-05-16 11:07:59 -06002299 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002300
Dustin Gravesc900f572016-05-16 11:07:59 -06002301 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2302 if (pCreateInfo != nullptr) {
2303 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2304 // VkQueryPipelineStatisticFlagBits values
2305 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2306 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2307 skip_call |=
2308 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2309 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2310 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2311 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2312 }
2313 }
2314
2315 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2317
Dustin Gravesc900f572016-05-16 11:07:59 -06002318 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002319 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002320
2321 return result;
2322}
2323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002324VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2325 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002326 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002327 assert(my_data != NULL);
2328
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002329 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002330
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002331 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002332 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002333 }
2334}
2335
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002336VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2337 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002338 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002339 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002341 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002342
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002343 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2344 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002345
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002346 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002347 result = get_dispatch_table(pc_device_table_map, device)
2348 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002349
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002350 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002351 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002352
2353 return result;
2354}
2355
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002356VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2357 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002358 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002359 bool skip_call = false;
2360 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2361 assert(device_data != nullptr);
2362 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002363
Karl Schultza9ef1e52016-10-06 17:53:48 -06002364 // TODO: Add check for VALIDATION_ERROR_00660
2365 // TODO: Add check for VALIDATION_ERROR_00661
2366 // TODO: Add check for VALIDATION_ERROR_00662
2367 // TODO: Add check for VALIDATION_ERROR_00670
2368 // TODO: Add check for VALIDATION_ERROR_00671
2369 // TODO: Add check for VALIDATION_ERROR_00672
2370 // TODO: Add check for VALIDATION_ERROR_00673
2371 // TODO: Add check for VALIDATION_ERROR_00674
2372 // TODO: Add check for VALIDATION_ERROR_00675
2373 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2374 // TODO: Add check for VALIDATION_ERROR_00663
Dustin Gravesc900f572016-05-16 11:07:59 -06002375 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002376
Dustin Gravesc900f572016-05-16 11:07:59 -06002377 if (pCreateInfo != nullptr) {
2378 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2379 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2380 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2381 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Karl Schultza9ef1e52016-10-06 17:53:48 -06002382 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2383 __LINE__, VALIDATION_ERROR_00665, LayerName,
2384 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2385 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2386 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002387 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002388
Dustin Gravesc900f572016-05-16 11:07:59 -06002389 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2390 // queueFamilyIndexCount uint32_t values
2391 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2392 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002393 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002394 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2395 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002396 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2397 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002398 }
2399
2400 // Ensure that the queue family indices were specified at device creation
2401 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2402 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2403 }
2404 }
2405
2406 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002407 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2408
Dustin Gravesc900f572016-05-16 11:07:59 -06002409 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002410 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002411
2412 return result;
2413}
2414
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002415VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2416 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002417 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002418 assert(my_data != NULL);
2419
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002420 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002422 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002423 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002424 }
2425}
2426
Chia-I Wu01ca2372016-05-13 14:37:49 +08002427VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2428 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002429 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002430 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002431 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002432 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002434 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002435
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002436 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002437 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2438
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002439 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002440 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002441
2442 return result;
2443}
2444
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002445VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2446 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002447 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002448 assert(my_data != NULL);
2449
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002450 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002452 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002453 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002454 }
2455}
2456
Chia-I Wu01ca2372016-05-13 14:37:49 +08002457VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2458 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002459 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2460 bool skip_call = false;
2461 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002462 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002463 debug_report_data *report_data = device_data->report_data;
2464
2465 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2466
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002467 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002468 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002469 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002470 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2471 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2472 skip_call |=
2473 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2474 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2475 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2476 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002477
Dustin Gravesc900f572016-05-16 11:07:59 -06002478 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2479 // queueFamilyIndexCount uint32_t values
2480 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2481 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2482 __LINE__, REQUIRED_PARAMETER, LayerName,
2483 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2484 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2485 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2486 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487
2488 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2489 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2490 }
2491
2492 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002493 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2494 skip_call |=
2495 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2496 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002497
2498 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002499 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002500
2501 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002502 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002503
2504 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2505 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2506 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2507 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002508 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002509 }
2510
2511 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2512 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2513 // extent.height must be equal
2514 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2515 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002516 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2517 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2518 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2519 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002520 }
2521
2522 if (pCreateInfo->extent.depth != 1) {
2523 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002524 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002525 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2526 }
2527 }
2528
2529 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2530 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2531 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002532 skip_call |=
2533 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2534 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2535 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002536 }
2537
2538 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2539 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2540 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2541 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002542 skip_call |=
2543 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2544 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2545 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002546 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002547 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002548
Dustin Gravesf8032f22016-05-11 18:31:44 -06002549 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002550 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2551
Dustin Gravesf8032f22016-05-11 18:31:44 -06002552 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002553 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002554
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002555 return result;
2556}
2557
Chia-I Wu01ca2372016-05-13 14:37:49 +08002558VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002559 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002560 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002561 assert(my_data != NULL);
2562
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002563 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002565 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002566 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002567 }
2568}
2569
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002570bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2571 if (pSubresource != nullptr) {
2572 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2573 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002574 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002575 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2577 return false;
2578 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002579 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002580
2581 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002582}
2583
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002584VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2585 VkSubresourceLayout *pLayout) {
2586 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002587 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002588 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002590 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002591
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002592 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002593 PreGetImageSubresourceLayout(device, pSubresource);
2594
2595 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002596 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002597}
2598
Chia-I Wu01ca2372016-05-13 14:37:49 +08002599VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2600 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002601 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002602 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002603 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002604 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002605 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002606
Dustin Graves0b70a632016-04-27 17:44:56 -06002607 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002608
Dustin Graves0b70a632016-04-27 17:44:56 -06002609 if (pCreateInfo != nullptr) {
2610 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002611 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2612 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002613 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2614 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2615 "pCreateInfo->subresourceRange.layerCount must be 1",
2616 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2617 }
2618 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002619 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2620 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2621 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002622 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2623 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2624 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2625 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2626 }
2627 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002628 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2629 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002630 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2631 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2632 "pCreateInfo->subresourceRange.layerCount must be 6");
2633 }
2634 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002635 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2636 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002637 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2638 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2639 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2640 }
2641 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2642 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2643 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2644 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2645 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2646 }
2647
Dustin Graves2a80dc62016-07-12 13:57:02 -06002648 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2649 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002650 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2651 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2652 "pCreateInfo->subresourceRange.layerCount must be 1");
2653 }
2654 }
2655 }
2656
2657 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002658 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2659
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002660 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002661 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002662
2663 return result;
2664}
2665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002666VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2667 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002668 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002669 assert(my_data != NULL);
2670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002671 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002673 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002674 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002675 }
2676}
2677
Chia-I Wu01ca2372016-05-13 14:37:49 +08002678VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002679 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002680 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002681 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002683 assert(my_data != NULL);
2684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002685 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002686
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002687 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 result =
2689 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002690
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002691 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002692 }
2693
Michael Lentine03d8e572015-09-15 14:59:14 -05002694 return result;
2695}
2696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002697VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2698 const VkAllocationCallbacks *pAllocator) {
2699 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002701 assert(my_data != NULL);
2702
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002703 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002704
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002705 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002706 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002707 }
2708}
2709
Chia-I Wu01ca2372016-05-13 14:37:49 +08002710VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002711 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002713 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002715 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002716
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002717 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002718
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002719 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 result =
2721 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002722
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002723 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002724 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002725
2726 return result;
2727}
2728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002729VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2730 const VkAllocationCallbacks *pAllocator) {
2731 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002733 assert(my_data != NULL);
2734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002735 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002736
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002737 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002738 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002739 }
2740}
2741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002742VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2743 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002744 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002745 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002746 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002747 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002749 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002751 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2753
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002754 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002756
2757 return result;
2758}
2759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002760VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2761 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002762 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002763 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002765 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002767 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002768
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002769 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002770 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2771
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002772 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002773 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002774
2775 return result;
2776}
2777
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002778bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002779 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2780
2781 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 if (pCreateInfos != nullptr) {
2783 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2784 if (pCreateInfos->basePipelineIndex != -1) {
2785 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002786 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002787 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002788 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2789 "pCreateInfos->flags "
2790 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2791 return false;
2792 }
2793 }
2794
2795 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2796 if (pCreateInfos->basePipelineIndex != -1) {
2797 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002798 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002799 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002800 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2801 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2802 "VK_NULL_HANDLE");
2803 return false;
2804 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002805 }
2806 }
2807
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002808 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002810 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002811 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002812 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2813 "unrecognized enumerator");
2814 return false;
2815 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002816
2817 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2818 (data->physical_device_features.fillModeNonSolid == false)) {
2819 log_msg(
2820 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2821 DEVICE_FEATURE, LayerName,
2822 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2823 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2824 return false;
2825 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002826 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002827
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002828 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002829 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002830 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2831 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002832 pCreateInfos[i].pStages[j].pName);
2833 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002834 }
2835
2836 return true;
2837}
2838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002839VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2840 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2841 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002842 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002843 bool skip_call = false;
2844 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2845 assert(device_data != nullptr);
2846 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002847
Dustin Gravesc900f572016-05-16 11:07:59 -06002848 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2849 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002850
Dustin Gravesc900f572016-05-16 11:07:59 -06002851 if (pCreateInfos != nullptr) {
2852 for (uint32_t i = 0; i < createInfoCount; ++i) {
2853 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2854 if (pCreateInfos[i].pTessellationState == nullptr) {
2855 if (pCreateInfos[i].pStages != nullptr) {
2856 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2857 // pTessellationState must not be NULL
2858 bool has_control = false;
2859 bool has_eval = false;
2860
2861 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2862 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2863 has_control = true;
2864 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2865 has_eval = true;
2866 }
2867 }
2868
2869 if (has_control && has_eval) {
2870 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2871 __LINE__, REQUIRED_PARAMETER, LayerName,
2872 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2873 "control shader stage and a tessellation evaluation shader stage, "
2874 "pCreateInfos[%d].pTessellationState must not be NULL",
2875 i, i);
2876 }
2877 }
Dustin Graves629259b2016-05-30 16:14:27 -06002878 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002879 skip_call |= validate_struct_pnext(
2880 report_data, "vkCreateGraphicsPipelines",
2881 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2882 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002883
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002884 skip_call |= validate_reserved_flags(
2885 report_data, "vkCreateGraphicsPipelines",
2886 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2887 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002888
2889 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2890 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2891 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2892 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2893 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2894 i);
2895 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002896 }
2897
2898 if (pCreateInfos[i].pViewportState == nullptr) {
2899 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2900 // valid VkPipelineViewportStateCreateInfo structure
2901 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2902 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2903 skip_call |= log_msg(
2904 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2905 REQUIRED_PARAMETER, LayerName,
2906 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2907 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2908 i, i);
2909 }
2910 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002911 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002912 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2913 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2914 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002915
2916 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002917 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2918 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002919 pCreateInfos[i].pViewportState->flags);
2920
Dustin Gravesc900f572016-05-16 11:07:59 -06002921 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2922 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2923 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2924 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2925 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2926 i);
2927 }
2928
2929 if (pCreateInfos[i].pDynamicState != nullptr) {
2930 bool has_dynamic_viewport = false;
2931 bool has_dynamic_scissor = false;
2932
2933 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2934 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2935 has_dynamic_viewport = true;
2936 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2937 has_dynamic_scissor = true;
2938 }
2939 }
2940
2941 // viewportCount must be greater than 0
2942 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2943 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2944 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2945 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002946 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2947 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002948 "must be greater than 0",
2949 i, i);
2950 }
2951
2952 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2953 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2954 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2955 skip_call |=
2956 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2957 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002958 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002959 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2960 i, i);
2961 }
2962
2963 // scissorCount must be greater than 0
2964 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2965 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2966 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2967 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002968 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2969 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002970 "must be greater than 0",
2971 i, i);
2972 }
2973
2974 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2975 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2976 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2977 skip_call |=
2978 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2979 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002980 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002981 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2982 i, i);
2983 }
2984 }
2985 }
2986
2987 if (pCreateInfos[i].pMultisampleState == nullptr) {
2988 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2989 // a valid VkPipelineMultisampleStateCreateInfo structure
2990 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2991 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2992 skip_call |=
2993 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2994 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2995 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2996 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2997 i, i);
2998 }
Dustin Graves629259b2016-05-30 16:14:27 -06002999 } else {
3000 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003001 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3002 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003003 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003004
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003005 skip_call |= validate_reserved_flags(
3006 report_data, "vkCreateGraphicsPipelines",
3007 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
3008 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003009
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003010 skip_call |= validate_bool32(
3011 report_data, "vkCreateGraphicsPipelines",
3012 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3013 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003014
3015 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003016 report_data, "vkCreateGraphicsPipelines",
3017 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3018 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3019 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3020 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003021
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003022 skip_call |= validate_bool32(
3023 report_data, "vkCreateGraphicsPipelines",
3024 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3025 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003026
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003027 skip_call |= validate_bool32(
3028 report_data, "vkCreateGraphicsPipelines",
3029 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3030 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003031
3032 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3033 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3034 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3035 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3036 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3037 i);
3038 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003039 }
3040
3041 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003042 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003043 skip_call |= validate_struct_pnext(
3044 report_data, "vkCreateGraphicsPipelines",
3045 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3046 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003047
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003048 skip_call |= validate_reserved_flags(
3049 report_data, "vkCreateGraphicsPipelines",
3050 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3051 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003052
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003053 skip_call |= validate_bool32(
3054 report_data, "vkCreateGraphicsPipelines",
3055 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3056 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003057
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003058 skip_call |= validate_bool32(
3059 report_data, "vkCreateGraphicsPipelines",
3060 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3061 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003062
3063 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003064 report_data, "vkCreateGraphicsPipelines",
3065 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3066 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3067 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003068
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003069 skip_call |= validate_bool32(
3070 report_data, "vkCreateGraphicsPipelines",
3071 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3072 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003073
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003074 skip_call |= validate_bool32(
3075 report_data, "vkCreateGraphicsPipelines",
3076 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3077 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003078
3079 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003080 report_data, "vkCreateGraphicsPipelines",
3081 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3082 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3083 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003084
3085 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003086 report_data, "vkCreateGraphicsPipelines",
3087 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3088 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3089 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003090
3091 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003092 report_data, "vkCreateGraphicsPipelines",
3093 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3094 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3095 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003096
3097 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003098 report_data, "vkCreateGraphicsPipelines",
3099 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3100 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3101 pCreateInfos[i].pDepthStencilState->front.compareOp);
3102
3103 skip_call |= validate_ranged_enum(
3104 report_data, "vkCreateGraphicsPipelines",
3105 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003106 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3107
3108 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003109 report_data, "vkCreateGraphicsPipelines",
3110 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003111 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3112
3113 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003114 report_data, "vkCreateGraphicsPipelines",
3115 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3116 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3117 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003118
3119 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003120 report_data, "vkCreateGraphicsPipelines",
3121 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3122 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3123 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003124
3125 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3126 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3127 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3128 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3129 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3130 i);
3131 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003132 }
3133
3134 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3135 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003136 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003137 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3138 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3139 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003140
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003141 skip_call |= validate_reserved_flags(
3142 report_data, "vkCreateGraphicsPipelines",
3143 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3144 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003145
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003146 skip_call |= validate_bool32(
3147 report_data, "vkCreateGraphicsPipelines",
3148 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3149 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003150
3151 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003152 report_data, "vkCreateGraphicsPipelines",
3153 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3154 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3155 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003156
3157 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3158 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3159 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003160 skip_call |=
3161 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3162 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3163 ParameterName::IndexVector{i, attachmentIndex}),
3164 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003165
3166 skip_call |= validate_ranged_enum(
3167 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003168 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3169 ParameterName::IndexVector{i, attachmentIndex}),
3170 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003171 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3172
3173 skip_call |= validate_ranged_enum(
3174 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003175 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3176 ParameterName::IndexVector{i, attachmentIndex}),
3177 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003178 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3179
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003180 skip_call |=
3181 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3182 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3183 ParameterName::IndexVector{i, attachmentIndex}),
3184 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3185 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003186
3187 skip_call |= validate_ranged_enum(
3188 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003189 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3190 ParameterName::IndexVector{i, attachmentIndex}),
3191 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003192 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3193
3194 skip_call |= validate_ranged_enum(
3195 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003196 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3197 ParameterName::IndexVector{i, attachmentIndex}),
3198 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003199 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3200
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003201 skip_call |=
3202 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3203 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3204 ParameterName::IndexVector{i, attachmentIndex}),
3205 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3206 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003207
3208 skip_call |=
3209 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003210 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3211 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003212 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3213 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3214 }
3215 }
3216
Dustin Gravesc900f572016-05-16 11:07:59 -06003217 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3218 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3219 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3220 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3221 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3222 i);
3223 }
3224
3225 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3226 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3227 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003228 report_data, "vkCreateGraphicsPipelines",
3229 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003230 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3231 }
3232 }
3233 }
3234 }
3235
3236 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003237 PreCreateGraphicsPipelines(device, pCreateInfos);
3238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003239 result = get_dispatch_table(pc_device_table_map, device)
3240 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003241
Dustin Gravesc900f572016-05-16 11:07:59 -06003242 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003243 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003244
3245 return result;
3246}
3247
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003248bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003249 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3250
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251 if (pCreateInfos != nullptr) {
3252 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003253 uint32_t i = 0;
3254 validate_string(data->report_data, "vkCreateComputePipelines",
3255 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003256 }
3257
3258 return true;
3259}
3260
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003261VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3262 const VkComputePipelineCreateInfo *pCreateInfos,
3263 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003264 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003265 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003266 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003267 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003268
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003269 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3270 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003271
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003272 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003273 PreCreateComputePipelines(device, pCreateInfos);
3274
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003275 result = get_dispatch_table(pc_device_table_map, device)
3276 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003277
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003278 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003279 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003280
3281 return result;
3282}
3283
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003284VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3285 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003286 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003287 assert(my_data != NULL);
3288
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003289 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003290
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003291 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003292 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003293 }
3294}
3295
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003296VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3297 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003298 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003299 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003300 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003301 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003302
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003303 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003305 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003306 result =
3307 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003308
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003309 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003310 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003311
3312 return result;
3313}
3314
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003315VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3316 const VkAllocationCallbacks *pAllocator) {
3317 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003318 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003319 assert(my_data != NULL);
3320
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003321 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003322
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003323 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003324 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003325 }
3326}
3327
Chia-I Wu01ca2372016-05-13 14:37:49 +08003328VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3329 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003330 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003331 bool skip_call = false;
3332 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3333 assert(device_data != NULL);
3334 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003335
Dustin Gravesc900f572016-05-16 11:07:59 -06003336 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003337
Dustin Gravesc900f572016-05-16 11:07:59 -06003338 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3339 if (pCreateInfo != nullptr) {
3340 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3341 if (pCreateInfo->compareEnable == VK_TRUE) {
3342 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3343 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3344 }
3345
3346 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3347 // valid VkBorderColor value
3348 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3349 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3350 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3351 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3352 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3353 }
3354 }
3355
3356 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003357 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3358
Dustin Gravesc900f572016-05-16 11:07:59 -06003359 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003360 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003361
3362 return result;
3363}
3364
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003365VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3366 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003367 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003368 assert(my_data != NULL);
3369
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003370 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003371
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003372 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003373 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003374 }
3375}
3376
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003377VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3378 const VkAllocationCallbacks *pAllocator,
3379 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003380 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003381 bool skip_call = false;
3382 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3383 assert(device_data != nullptr);
3384 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003385
Dustin Gravesc900f572016-05-16 11:07:59 -06003386 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003387
Dustin Gravesc900f572016-05-16 11:07:59 -06003388 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3389 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3390 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3391 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3392 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3393 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3394 // valid VkSampler handles
3395 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3396 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3397 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3398 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3399 ++descriptor_index) {
3400 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3401 skip_call |=
3402 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3403 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3404 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3405 " specified as VK_NULL_HANDLE",
3406 i, descriptor_index);
3407 }
3408 }
3409 }
3410
3411 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3412 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3413 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3414 skip_call |=
3415 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3416 UNRECOGNIZED_VALUE, LayerName,
3417 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3418 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3419 i, i);
3420 }
3421 }
3422 }
3423 }
3424
3425 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003426 result =
3427 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003428
Dustin Gravesc900f572016-05-16 11:07:59 -06003429 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003431
3432 return result;
3433}
3434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003435VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3436 const VkAllocationCallbacks *pAllocator) {
3437 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003439 assert(my_data != NULL);
3440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003441 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003442
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003443 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003444 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003445 }
3446}
3447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003448VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3449 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003450 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003451 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003452 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003453 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003454
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003455 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003456
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003457 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003459 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003460 result =
3461 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003462
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003463 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003464 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003465
3466 return result;
3467}
3468
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003469VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3470 const VkAllocationCallbacks *pAllocator) {
3471 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003472 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003473 assert(my_data != NULL);
3474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003475 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003477 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003478 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003479 }
3480}
3481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003482VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3483 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003484 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003485 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3487 assert(my_data != NULL);
3488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003489 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003491 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003492 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3493
3494 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3495 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003496
3497 return result;
3498}
3499
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003500VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3501 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003502 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003503 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003504 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003505 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003507 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003509 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003510 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3511
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003512 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003513 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003514
3515 return result;
3516}
3517
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003518VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003519 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003520 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003521 bool skip_call = false;
3522 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3523 assert(device_data != nullptr);
3524 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003525
Dustin Gravesc900f572016-05-16 11:07:59 -06003526 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003527
Dustin Gravesc900f572016-05-16 11:07:59 -06003528 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3529 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3530 // validate_array()
3531 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3532 pDescriptorSets, true, true);
3533
3534 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003535 result = get_dispatch_table(pc_device_table_map, device)
3536 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003537
Dustin Gravesc900f572016-05-16 11:07:59 -06003538 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003539 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003540
3541 return result;
3542}
3543
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003544VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3545 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3546 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003547 bool skip_call = false;
3548 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3549 assert(device_data != NULL);
3550 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003551
Dustin Gravesc900f572016-05-16 11:07:59 -06003552 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3553 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003554
Dustin Gravesc900f572016-05-16 11:07:59 -06003555 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3556 if (pDescriptorWrites != NULL) {
3557 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3558 // descriptorCount must be greater than 0
3559 if (pDescriptorWrites[i].descriptorCount == 0) {
3560 skip_call |=
3561 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3562 REQUIRED_PARAMETER, LayerName,
3563 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3564 }
3565
3566 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3567 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3568 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3569 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3570 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3571 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3572 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3573 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3574 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3575 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3576 __LINE__, REQUIRED_PARAMETER, LayerName,
3577 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3578 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3579 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3580 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3581 i, i);
3582 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3583 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3584 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3585 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3586 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3587 ++descriptor_index) {
3588 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003589 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3590 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003591 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3592 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003593 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3594 ParameterName::IndexVector{i, descriptor_index}),
3595 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003596 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3597 }
3598 }
3599 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3600 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3601 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3602 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3603 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3604 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3605 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3606 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3607 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3608 __LINE__, REQUIRED_PARAMETER, LayerName,
3609 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3610 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3611 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3612 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3613 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003614 } else {
3615 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3616 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003617 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3618 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003619 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3620 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003621 }
3622 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3623 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3624 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3625 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3626 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3627 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3628 __LINE__, REQUIRED_PARAMETER, LayerName,
3629 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3630 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3631 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3632 i, i);
3633 } else {
3634 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3635 ++descriptor_index) {
3636 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003637 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3638 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003639 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3640 }
3641 }
3642 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003643
3644 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3645 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3646 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3647 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3648 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3649 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3650 skip_call |=
3651 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003652 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003653 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3654 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3655 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3656 }
3657 }
3658 }
3659 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3660 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3661 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3662 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3663 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3664 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3665 skip_call |=
3666 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003667 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003668 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3669 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3670 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3671 }
3672 }
3673 }
3674 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003675 }
3676 }
3677
3678 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003679 get_dispatch_table(pc_device_table_map, device)
3680 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003681 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003682}
3683
Chia-I Wu01ca2372016-05-13 14:37:49 +08003684VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003685 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003686 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003687 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003689 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003690
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003691 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003692
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003693 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003694 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3695
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003696 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003697 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003698
3699 return result;
3700}
3701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003702VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3703 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003704 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003705 assert(my_data != NULL);
3706
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003707 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003708
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003709 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003710 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003711 }
3712}
3713
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003714bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3715 bool skip_call = false;
3716 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3717
3718 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3719 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3720 skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003721 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003722 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3723 }
3724 }
3725 return skip_call;
3726}
3727
Chia-I Wu01ca2372016-05-13 14:37:49 +08003728VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003729 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003730 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003731 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003733 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003735 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3736 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003738 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003739 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3740
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003741 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003742 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003743
3744 return result;
3745}
3746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003747VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3748 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003749 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003750 assert(my_data != NULL);
3751
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003752 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003754 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003755 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003756 }
3757}
3758
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003759VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3760 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003761 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003762 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003763
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003764 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003765
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003766 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003767 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003768 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003769}
3770
Chia-I Wu01ca2372016-05-13 14:37:49 +08003771VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003772 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003774 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003776 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003778 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003779 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003780
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003781 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003783 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003784 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3785
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003786 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003787 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003788
3789 return result;
3790}
3791
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003792VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3793 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003794 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003795 assert(my_data != NULL);
3796
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003797 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003798
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003799 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003800 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003801 }
3802}
3803
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003804VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003805 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003806 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003807 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3808 assert(my_data != NULL);
3809
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003810 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003811
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003812 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003813 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3814
3815 validate_result(my_data->report_data, "vkResetCommandPool", result);
3816 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003817
3818 return result;
3819}
3820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003821VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3822 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003824 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003826 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003827
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003828 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003829
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003830 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003831 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3832
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003833 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003834 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003835
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003836 return result;
3837}
3838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003839VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003840 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003841 bool skip_call = false;
3842 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3843 assert(device_data != nullptr);
3844 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003845
Dustin Gravesc900f572016-05-16 11:07:59 -06003846 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003847
Dustin Gravesc900f572016-05-16 11:07:59 -06003848 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3849 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3850 // validate_array()
3851 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3852 pCommandBuffers, true, true);
3853
3854 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003855 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003856 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003857 }
3858}
3859
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003860bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3861 bool skip_call = false;
3862 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3863 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3864
3865 if (pInfo != NULL) {
3866 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3867 skip_call |=
3868 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 -06003869 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003870 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3871 "inheritedQueries.");
3872 }
3873
3874 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3875 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3876 skip_call |=
3877 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 -06003878 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003879 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3880 "valid combination of VkQueryControlFlagBits.",
3881 pInfo->queryFlags);
3882 }
3883 }
3884 return skip_call;
3885}
3886
3887VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003888 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003889 bool skip_call = false;
3890 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3891 assert(device_data != nullptr);
3892 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003893
Dustin Gravesc900f572016-05-16 11:07:59 -06003894 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003895
Dustin Gravesc900f572016-05-16 11:07:59 -06003896 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3897 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3898 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3899 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3900 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3901
3902 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003903 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003904 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003905
3906 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3907 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3908
Dustin Gravesc900f572016-05-16 11:07:59 -06003909 // TODO: This only needs to be validated when the inherited queries feature is enabled
3910 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3911 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3912
3913 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3914 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3915 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3916 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3917 }
3918
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003919 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3920
Dustin Gravesc900f572016-05-16 11:07:59 -06003921 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003922 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3923
Dustin Gravesc900f572016-05-16 11:07:59 -06003924 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003925 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003926
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003927 return result;
3928}
3929
Chia-I Wu01ca2372016-05-13 14:37:49 +08003930VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003931 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3932 assert(my_data != NULL);
3933
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003934 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003936 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003938 return result;
3939}
3940
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003941VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003942 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003943 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3944 assert(my_data != NULL);
3945
Dustin Graves16d18972016-05-09 17:36:57 -06003946 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947
Dustin Graves16d18972016-05-09 17:36:57 -06003948 if (!skip_call) {
3949 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3950
3951 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3952 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003953
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003954 return result;
3955}
3956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003957VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3958 VkPipeline pipeline) {
3959 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003960 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3961 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003962
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003963 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003965 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003966 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3967 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003968}
3969
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003970bool preCmdSetViewport(debug_report_data *report_data, uint32_t viewport_count, const VkViewport *viewports) {
3971 bool skip =
3972 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
3973 return skip;
3974}
3975
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003976VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3977 const VkViewport *pViewports) {
3978 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003980 assert(my_data != NULL);
3981
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003982 skip_call |= preCmdSetViewport(my_data->report_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003983
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003984 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003985 get_dispatch_table(pc_device_table_map, commandBuffer)
3986 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003987 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003988}
3989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003990VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3991 const VkRect2D *pScissors) {
3992 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003993 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003994 assert(my_data != NULL);
3995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003996 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003997
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003998 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003999 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4000 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004001}
4002
Chia-I Wu01ca2372016-05-13 14:37:49 +08004003VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004004 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004005}
4006
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004007VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4008 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004009 get_dispatch_table(pc_device_table_map, commandBuffer)
4010 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004011}
4012
Chia-I Wu01ca2372016-05-13 14:37:49 +08004013VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004014 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004015 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004016 assert(my_data != NULL);
4017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004018 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004019
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004020 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004021 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4022 }
Cody Northrop12365112015-08-17 11:10:49 -06004023}
4024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004025VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004026 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004027}
4028
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004029VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4030 uint32_t compareMask) {
4031 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004032 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4033 assert(my_data != NULL);
4034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004035 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004036
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004037 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004038 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4039 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004040}
4041
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004042VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4043 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004044 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4045 assert(my_data != NULL);
4046
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004047 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004048
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004049 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004050 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4051 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004052}
4053
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004054VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4055 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004056 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4057 assert(my_data != NULL);
4058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004059 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004061 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004062 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4063 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004064}
4065
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004066VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4067 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4068 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4069 const uint32_t *pDynamicOffsets) {
4070 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004071 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004072 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004074 skip_call |=
4075 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4076 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004077
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004078 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004079 get_dispatch_table(pc_device_table_map, commandBuffer)
4080 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4081 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004082 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004083}
4084
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004085VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4086 VkIndexType indexType) {
4087 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004088 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4089 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004090
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004091 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004092
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004093 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004094 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4095 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004096}
4097
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004098VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4099 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4100 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004102 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004103
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004104 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004106 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004107 get_dispatch_table(pc_device_table_map, commandBuffer)
4108 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004109 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004110}
4111
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004112bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4113 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004114 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004115 // 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 -07004116 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004117 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004118 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004119 return false;
4120 }
4121
4122 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004123 // 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 -07004124 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004125 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004126 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004127 return false;
4128 }
4129
4130 return true;
4131}
4132
Chia-I Wu01ca2372016-05-13 14:37:49 +08004133VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4134 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004135 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004136
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004137 get_dispatch_table(pc_device_table_map, commandBuffer)
4138 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004139}
4140
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004141VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4142 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004143 get_dispatch_table(pc_device_table_map, commandBuffer)
4144 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004145}
4146
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004147VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4148 uint32_t stride) {
4149 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004150 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4151 assert(my_data != NULL);
4152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004153 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004154
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004155 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004156 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4157 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004158}
4159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004160VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4161 uint32_t count, uint32_t stride) {
4162 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004163 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4164 assert(my_data != NULL);
4165
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004166 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004167
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004168 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004169 get_dispatch_table(pc_device_table_map, commandBuffer)
4170 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4171 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004172}
4173
Chia-I Wu01ca2372016-05-13 14:37:49 +08004174VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004175 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004176}
4177
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004178VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4179 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004180 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4181 assert(my_data != NULL);
4182
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004183 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004184
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004185 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004186 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4187 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004188}
4189
Chia-I Wu01ca2372016-05-13 14:37:49 +08004190VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4191 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004192 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004193 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004194 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004195
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004196 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004197
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004198 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004199 get_dispatch_table(pc_device_table_map, commandBuffer)
4200 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004201 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004202}
4203
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004204bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4205 if (pRegions != nullptr) {
4206 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4207 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004208 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004209 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004210 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4211 return false;
4212 }
4213 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4214 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004215 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004216 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004217 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4218 return false;
4219 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004220 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004221
4222 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004223}
4224
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004225VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4226 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4227 const VkImageCopy *pRegions) {
4228 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004229 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004230 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004231
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004232 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4233 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004235 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004236 PreCmdCopyImage(commandBuffer, pRegions);
4237
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004238 get_dispatch_table(pc_device_table_map, commandBuffer)
4239 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004240 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004241}
4242
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004243bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4244 if (pRegions != nullptr) {
4245 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4246 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004247 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004248 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004249 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4250 return false;
4251 }
4252 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4253 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004254 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004255 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004256 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4257 return false;
4258 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004259 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004260
4261 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004262}
4263
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004264VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4265 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4266 const VkImageBlit *pRegions, VkFilter filter) {
4267 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004268 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004269 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004270
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004271 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4272 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004273
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004274 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004275 PreCmdBlitImage(commandBuffer, pRegions);
4276
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004277 get_dispatch_table(pc_device_table_map, commandBuffer)
4278 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004279 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004280}
4281
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4283 if (pRegions != nullptr) {
4284 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4285 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004286 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004287 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004288 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4289 "enumerator");
4290 return false;
4291 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004292 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004293
4294 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004295}
4296
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004297VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4298 VkImageLayout dstImageLayout, uint32_t regionCount,
4299 const VkBufferImageCopy *pRegions) {
4300 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004301 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004302 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004304 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4305 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004306
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004307 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004308 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4309
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004310 get_dispatch_table(pc_device_table_map, commandBuffer)
4311 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004312 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004313}
4314
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004315bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4316 if (pRegions != nullptr) {
4317 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4318 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004319 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004320 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004321 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4322 "enumerator");
4323 return false;
4324 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004325 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004326
4327 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328}
4329
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004330VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4331 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4332 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004333 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004334 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004335
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004336 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4337 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004338
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004339 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004340 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4341
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004342 get_dispatch_table(pc_device_table_map, commandBuffer)
4343 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004344 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004345}
4346
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004347VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4348 VkDeviceSize dataSize, const uint32_t *pData) {
4349 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004350 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004351 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004352
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004353 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004354
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004355 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004356 skip_call |= log_msg(
4357 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4358 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004359 }
4360
4361 if ((dataSize <= 0) || (dataSize > 65536)) {
4362 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004363 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4364 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004365 dataSize);
4366 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004367 skip_call |= log_msg(
4368 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4369 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004370 }
4371
4372 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004373 get_dispatch_table(pc_device_table_map, commandBuffer)
4374 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004375 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004376}
4377
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004378VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4379 VkDeviceSize size, uint32_t data) {
4380 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004381 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4382 assert(my_data != NULL);
4383
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004384 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004385
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004386 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004387 skip_call |= log_msg(
4388 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4389 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004390 }
4391
4392 if (size != VK_WHOLE_SIZE) {
4393 if (size <= 0) {
4394 skip_call |= log_msg(
4395 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004396 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004397 } else if (size & 3) {
4398 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004399 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004400 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4401 }
4402 }
4403
4404 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004405 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4406 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004407}
4408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004409VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4410 const VkClearColorValue *pColor, uint32_t rangeCount,
4411 const VkImageSubresourceRange *pRanges) {
4412 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004413 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004414 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004415
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004416 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004418 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004419 get_dispatch_table(pc_device_table_map, commandBuffer)
4420 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004421 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004422}
4423
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004424VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4425 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4426 const VkImageSubresourceRange *pRanges) {
4427 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004429 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004431 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4432 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004434 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004435 get_dispatch_table(pc_device_table_map, commandBuffer)
4436 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004437 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004438}
4439
Chia-I Wu01ca2372016-05-13 14:37:49 +08004440VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4441 const VkClearAttachment *pAttachments, uint32_t rectCount,
4442 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004443 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004444 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004445 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004446
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004447 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004448
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004449 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004450 get_dispatch_table(pc_device_table_map, commandBuffer)
4451 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004452 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004453}
4454
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004455bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4456 if (pRegions != nullptr) {
4457 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4458 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4459 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004460 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004461 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004462 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4463 return false;
4464 }
4465 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4466 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4467 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004468 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004469 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004470 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4471 return false;
4472 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004473 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004474
4475 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004476}
4477
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004478VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4479 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4480 const VkImageResolve *pRegions) {
4481 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004482 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004483 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004484
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004485 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4486 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004488 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004489 PreCmdResolveImage(commandBuffer, pRegions);
4490
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004491 get_dispatch_table(pc_device_table_map, commandBuffer)
4492 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004493 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004494}
4495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004496VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4497 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004498 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4499 assert(my_data != NULL);
4500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004502
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004503 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004504 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4505 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004506}
4507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004508VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4509 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004510 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4511 assert(my_data != NULL);
4512
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004513 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004514
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004515 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004516 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4517 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004518}
4519
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004520VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4521 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4522 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4523 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4524 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4525 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004526 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004527 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004529 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4530 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4531 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004532
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004533 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004534 get_dispatch_table(pc_device_table_map, commandBuffer)
4535 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4536 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004537 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004538}
4539
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004540VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4541 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4542 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4543 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4544 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4545 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004546 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004547 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004548
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004549 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4550 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4551 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004552
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004553 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004554 get_dispatch_table(pc_device_table_map, commandBuffer)
4555 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4556 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004557 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004558}
4559
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004560VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4561 VkQueryControlFlags flags) {
4562 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004563 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4564 assert(my_data != NULL);
4565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004566 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004567
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004568 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004569 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4570 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004571}
4572
Chia-I Wu01ca2372016-05-13 14:37:49 +08004573VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004574 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004575 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4576 assert(my_data != NULL);
4577
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004578 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004579
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004580 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004581 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4582 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004583}
4584
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004585VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4586 uint32_t queryCount) {
4587 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004588 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4589 assert(my_data != NULL);
4590
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004591 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004592
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004593 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004594 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4595 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004596}
4597
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004598bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4599 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004600
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004601 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004602
4603 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004604}
4605
Chia-I Wu01ca2372016-05-13 14:37:49 +08004606VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4607 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004608 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004609 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4610 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004611
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004612 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004613
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004614 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004615 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4616
4617 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4618 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004619}
4620
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004621VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4622 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4623 VkDeviceSize stride, VkQueryResultFlags flags) {
4624 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004625 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4626 assert(my_data != NULL);
4627
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004628 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4629 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004630
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004631 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004632 get_dispatch_table(pc_device_table_map, commandBuffer)
4633 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4634 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004635}
4636
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004637VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4638 uint32_t offset, uint32_t size, const void *pValues) {
4639 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004640 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004641 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004642
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004643 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004644
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004645 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004646 get_dispatch_table(pc_device_table_map, commandBuffer)
4647 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004648 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004649}
4650
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004651VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4652 VkSubpassContents contents) {
4653 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004654 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004655 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004656
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004657 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004658
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004659 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004660 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004661 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004662}
4663
Chia-I Wu01ca2372016-05-13 14:37:49 +08004664VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004665 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004666 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4667 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004669 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004671 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004672 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4673 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004674}
4675
Chia-I Wu01ca2372016-05-13 14:37:49 +08004676VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004677 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004678}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004679
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004680VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4681 const VkCommandBuffer *pCommandBuffers) {
4682 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004683 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004684 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004685
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004686 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004687
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004688 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004689 get_dispatch_table(pc_device_table_map, commandBuffer)
4690 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004691 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004692}
4693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004694VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004695 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4696}
4697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004698VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4699 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004700 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4701}
4702
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004703VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4704 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004705 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4706 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4707
4708 return VK_ERROR_LAYER_NOT_PRESENT;
4709}
4710
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004711VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4712 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004713 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004714 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004715 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004716
4717 assert(physicalDevice);
4718
4719 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4720 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004721}
4722
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004723// WSI Extension Functions
4724
4725VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004726 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004727 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004728 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004729 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4730 assert(my_data != NULL);
4731
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004732 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004733
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004734 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004735 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4736
4737 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4738 }
4739
4740 return result;
4741}
4742
4743VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004744 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004745 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004746 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004747 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4748 assert(my_data != NULL);
4749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004750 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004751 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004753 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004754 result = get_dispatch_table(pc_device_table_map, device)
4755 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4756
4757 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4758 }
4759
4760 return result;
4761}
4762
4763VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004764 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004765 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004766 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004767 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4768 assert(my_data != NULL);
4769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004770 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004771 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4772
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004773 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004774 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004775 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004776
4777 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4778 }
4779
4780 return result;
4781}
4782
4783VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4784 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004785 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4787 assert(my_data != NULL);
4788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004789 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004791 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004792 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4793
4794 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4795 }
4796
4797 return result;
4798}
4799
4800VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4801 VkSurfaceKHR surface, VkBool32 *pSupported) {
4802 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004803 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4805 assert(my_data != NULL);
4806
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004807 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004808 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4809
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004810 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004811 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4812 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4813
4814 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4815 }
4816
4817 return result;
4818}
4819
4820VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4821 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4822 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004823 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004824 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4825 assert(my_data != NULL);
4826
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004827 skip_call |=
4828 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004829
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004830 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004831 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4832 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4833
4834 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4835 }
4836
4837 return result;
4838}
4839
4840VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4841 uint32_t *pSurfaceFormatCount,
4842 VkSurfaceFormatKHR *pSurfaceFormats) {
4843 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004844 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4846 assert(my_data != NULL);
4847
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004848 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4849 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004850
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004851 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004852 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4853 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4854
4855 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4856 }
4857
4858 return result;
4859}
4860
4861VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4862 uint32_t *pPresentModeCount,
4863 VkPresentModeKHR *pPresentModes) {
4864 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004865 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004866 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4867 assert(my_data != NULL);
4868
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004869 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4870 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004871
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004872 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4874 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4875
4876 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4877 }
4878
4879 return result;
4880}
4881
4882#ifdef VK_USE_PLATFORM_WIN32_KHR
4883VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4884 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4885 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4886
4887 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4888 assert(my_data != NULL);
4889
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004890 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004892 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004893 result =
4894 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4895 }
4896
4897 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4898
4899 return result;
4900}
4901#endif // VK_USE_PLATFORM_WIN32_KHR
4902
4903#ifdef VK_USE_PLATFORM_XCB_KHR
4904VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4905 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4906 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4907
4908 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4909 assert(my_data != NULL);
4910
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004911 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004912
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004913 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004914 result =
4915 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4916 }
4917
4918 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4919
4920 return result;
4921}
4922
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004923VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4924 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4925 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004926 VkBool32 result = false;
4927
4928 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4929 assert(my_data != NULL);
4930
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004931 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4932 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004934 if (!skip_call) {
4935 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4936 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004937 }
4938
4939 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004940}
4941#endif // VK_USE_PLATFORM_XCB_KHR
4942
4943#ifdef VK_USE_PLATFORM_XLIB_KHR
4944VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004945 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004946 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4947
4948 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4949 assert(my_data != NULL);
4950
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004951 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004952
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004953 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004954 result =
4955 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4956 }
4957
4958 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4959
4960 return result;
4961}
4962
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004963VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4964 uint32_t queueFamilyIndex, Display *dpy,
4965 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004966 VkBool32 result = false;
4967
4968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4969 assert(my_data != NULL);
4970
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004971 bool skip_call =
4972 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004974 if (!skip_call) {
4975 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4976 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004977 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06004978 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004979}
4980#endif // VK_USE_PLATFORM_XLIB_KHR
4981
4982#ifdef VK_USE_PLATFORM_MIR_KHR
4983VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004984 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004985 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4986
4987 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4988 assert(my_data != NULL);
4989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004990 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004991
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004992 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004993 result =
4994 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4995 }
4996
4997 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4998
4999 return result;
5000}
5001
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005002VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5003 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005004 VkBool32 result = false;
5005
5006 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5007 assert(my_data != NULL);
5008
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005009 bool skip_call =
5010 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005011
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005012 if (!skip_call) {
5013 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5014 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005015 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005016}
5017#endif // VK_USE_PLATFORM_MIR_KHR
5018
5019#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5020VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005021 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005022 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5023
5024 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5025 assert(my_data != NULL);
5026
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005027 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005028
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005029 if (!skip_call) {
5030 result = get_dispatch_table(pc_instance_table_map, instance)
5031 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005032 }
5033
5034 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5035
5036 return result;
5037}
5038
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005039VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5040 uint32_t queueFamilyIndex,
5041 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005042 VkBool32 result = false;
5043
5044 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5045 assert(my_data != NULL);
5046
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005047 bool skip_call =
5048 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005049
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005050 if (!skip_call) {
5051 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5052 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005053 }
5054}
5055#endif // VK_USE_PLATFORM_WAYLAND_KHR
5056
5057#ifdef VK_USE_PLATFORM_ANDROID_KHR
5058VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005059 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005060 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5061
5062 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5063 assert(my_data != NULL);
5064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005065 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005066
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005067 if (!skip_call) {
5068 result = get_dispatch_table(pc_instance_table_map, instance)
5069 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005070 }
5071
5072 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5073
5074 return result;
5075}
5076#endif // VK_USE_PLATFORM_ANDROID_KHR
5077
Mark Youngead9b932016-09-08 12:28:38 -06005078VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5079 const VkSwapchainCreateInfoKHR *pCreateInfos,
5080 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5081 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5082 bool skip_call = false;
5083 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5084 assert(my_data != NULL);
5085
5086 skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
5087 pSwapchains);
5088
5089 if (!skip_call) {
5090 result = get_dispatch_table(pc_device_table_map, device)
5091 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5092
5093 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5094 }
5095
5096 return result;
5097}
5098
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005099// VK_EXT_debug_marker Extension
5100VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5101 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5102 bool skip_call = false;
5103 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5104 assert(my_data != NULL);
5105
5106 skip_call |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
5107
5108 if (!skip_call) {
5109 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5110
5111 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5112 }
5113
5114 return result;
5115}
5116
5117VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5118 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5119 bool skip_call = false;
5120 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5121 assert(my_data != NULL);
5122
5123 skip_call |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
5124
5125 if (!skip_call) {
5126 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5127
5128 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5129 }
5130
5131 return result;
5132}
5133
5134VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5135 bool skip_call = false;
5136 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5137 assert(my_data != NULL);
5138
5139 skip_call |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
5140
5141 if (!skip_call) {
5142 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5143 }
5144}
5145
5146VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5147 bool skip_call = false;
5148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5149 assert(my_data != NULL);
5150
5151 skip_call |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
5152
5153 if (!skip_call) {
5154 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5155 }
5156}
5157
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005158// VK_NV_external_memory_capabilities Extension
5159VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5160 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5161 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5162 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5163
5164 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5165 bool skip_call = false;
5166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5167 assert(my_data != NULL);
5168
5169 skip_call |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
5170 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5171
5172 if (!skip_call) {
5173 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5174 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5175 externalHandleType, pExternalImageFormatProperties);
5176
5177 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5178 }
5179
5180 return result;
5181}
5182
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005183#ifdef VK_USE_PLATFORM_WIN32_KHR
5184// VK_NV_external_memory_win32 Extension
5185VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5186 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5187
5188 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5189 bool skip_call = false;
5190 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5191 assert(my_data != NULL);
5192
5193 skip_call |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
5194
5195 if (!skip_call) {
5196 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5197 }
5198
5199 return result;
5200}
5201#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005202
5203
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005205static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005206
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005207static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005208
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005209static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005210
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005211static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005212
Chia-I Wu01ca2372016-05-13 14:37:49 +08005213VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005214 assert(device);
5215
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005216 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5217
Dustin Graves080069b2016-04-05 13:48:15 -06005218 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005219 return NULL;
5220 }
5221
Chia-I Wuf9b01382016-05-16 07:37:41 +08005222 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5223 if (proc)
5224 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005225
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005226 proc = InterceptWsiEnabledCommand(funcName, device);
5227 if (proc)
5228 return proc;
5229
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005230 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005231 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005232 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005233}
5234
Chia-I Wu01ca2372016-05-13 14:37:49 +08005235VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005236 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005237 if (!proc)
5238 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005239
5240 if (!proc)
5241 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005242
Chia-I Wu617f2a42016-05-16 07:41:17 +08005243 if (proc)
5244 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005245
Chia-I Wu617f2a42016-05-16 07:41:17 +08005246 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005247
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005248 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005249
Chia-I Wu617f2a42016-05-16 07:41:17 +08005250 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005251 if (!proc)
5252 proc = InterceptWsiEnabledCommand(funcName, instance);
5253
Chia-I Wu617f2a42016-05-16 07:41:17 +08005254 if (proc)
5255 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005256
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005257 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005258 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005259 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005260}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005261
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005262static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005263 static const struct {
5264 const char *name;
5265 PFN_vkVoidFunction proc;
5266 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005267 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5268 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5269 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5270 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5271 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5272 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5273 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5274 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5275 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5276 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5277 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5278 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5279 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5280 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5281 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5282 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5283 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005284 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005285 };
5286
5287 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5288 if (!strcmp(core_instance_commands[i].name, name))
5289 return core_instance_commands[i].proc;
5290 }
5291
5292 return nullptr;
5293}
5294
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005295static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005296 static const struct {
5297 const char *name;
5298 PFN_vkVoidFunction proc;
5299 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005300 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5301 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5302 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5303 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5304 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5305 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5306 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5307 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5308 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5309 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5310 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5311 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5312 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5313 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5314 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5315 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5316 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5317 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5318 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5319 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5320 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5321 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5322 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5323 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5324 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5325 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5326 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5327 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5328 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5329 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5330 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5331 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5332 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5333 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5334 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5335 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5336 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5337 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5338 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5339 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5340 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5341 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5342 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5343 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5344 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5345 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5346 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5347 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5348 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5349 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5350 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5351 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5352 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5353 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5354 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5355 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5356 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5357 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5358 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5359 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5360 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5361 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5362 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5363 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5364 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5365 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5366 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5367 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5368 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5369 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5370 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5371 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5372 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5373 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5374 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5375 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5376 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5377 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5378 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5379 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5380 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5381 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5382 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5383 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5384 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5385 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5386 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5387 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5388 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5389 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5390 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5391 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5392 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5393 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5394 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5395 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5396 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5397 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5398 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5399 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5400 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5401 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5402 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5403 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5404 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5405 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5406 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5407 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5408 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5409 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5410 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5411 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5412 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5413 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5414 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5415 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5416 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005417 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5418 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5419 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5420 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005421#ifdef VK_USE_PLATFORM_WIN32_KHR
5422 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5423#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005424};
5425
Chia-I Wuf9b01382016-05-16 07:37:41 +08005426
5427 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5428 if (!strcmp(core_device_commands[i].name, name))
5429 return core_device_commands[i].proc;
5430 }
5431
5432 return nullptr;
5433}
5434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005435static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005436 static const struct {
5437 const char *name;
5438 PFN_vkVoidFunction proc;
5439 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005440 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5441 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5442 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5443 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005444 };
5445
5446 if (device) {
5447 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005448
Mark Youngead9b932016-09-08 12:28:38 -06005449 if (device_data->wsi_enabled) {
5450 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5451 if (!strcmp(wsi_device_commands[i].name, name))
5452 return wsi_device_commands[i].proc;
5453 }
5454 }
5455
5456 if (device_data->wsi_display_swapchain_enabled) {
5457 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5458 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
5459 }
5460 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005461 }
5462
5463 return nullptr;
5464}
5465
5466static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5467 static const struct {
5468 const char *name;
5469 PFN_vkVoidFunction proc;
5470 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005471 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5472 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5473 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5474 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5475 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5476 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005477 };
5478
5479 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005480 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005481 return nullptr;
5482
5483 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5484 if (!strcmp(wsi_instance_commands[i].name, name))
5485 return wsi_instance_commands[i].proc;
5486 }
5487
5488#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005489 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005490 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5491#endif // VK_USE_PLATFORM_WIN32_KHR
5492#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005493 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005494 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005495 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005496 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5497#endif // VK_USE_PLATFORM_XCB_KHR
5498#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005499 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005500 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005501 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005502 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5503#endif // VK_USE_PLATFORM_XLIB_KHR
5504#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005505 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005506 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005507 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005508 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5509#endif // VK_USE_PLATFORM_MIR_KHR
5510#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005511 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005512 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005513 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5514 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005515 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5516#endif // VK_USE_PLATFORM_WAYLAND_KHR
5517#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005518 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005519 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5520#endif // VK_USE_PLATFORM_ANDROID_KHR
5521
5522 return nullptr;
5523}
5524
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005525} // namespace parameter_validation
5526
5527// vk_layer_logging.h expects these to be defined
5528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005529VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5530 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5531 const VkAllocationCallbacks *pAllocator,
5532 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005533 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005534}
5535
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005536VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5537 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005538 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005539}
5540
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005541VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5542 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5543 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005544 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005545}
5546
5547// loader-layer interface v0
5548
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005549VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5550 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005551 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005552}
5553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005554VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5555 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005556 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005557}
5558
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005559VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5560 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005561 // the layer command handles VK_NULL_HANDLE just fine internally
5562 assert(physicalDevice == VK_NULL_HANDLE);
5563 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005564}
5565
5566VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5567 const char *pLayerName, uint32_t *pCount,
5568 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005569 // the layer command handles VK_NULL_HANDLE just fine internally
5570 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005571 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005572}
5573
5574VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005575 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005576}
5577
5578VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005579 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005580}