blob: e03f49cf817e6df4886eb0908a7c6f5563a466ed [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
Mike Weiblena4742dc2016-10-31 11:05:56 -060026#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060027#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060028#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32#include <iostream>
33#include <string>
34#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050035#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060036#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060037#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060038
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060039#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070040#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060041#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060042#include "vk_enum_validate_helper.h"
43#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060044
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060045#include "vk_layer_table.h"
46#include "vk_layer_data.h"
47#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060048#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070049#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060050
Dustin Graves8ffbbf62016-07-22 13:19:46 -060051#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060052#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070053
Chia-I Wu1a6b1932016-05-13 14:07:36 +080054namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060055
Cody Northrop55443ef2015-09-28 15:09:32 -060056struct layer_data {
Chia-I Wua570b7c2016-05-16 07:48:14 +080057 VkInstance instance;
58
Jeremy Hayes99a96322015-06-26 12:48:09 -060059 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070060 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060061
Ian Elliotted6b5ac2016-04-28 09:08:13 -060062 // The following are for keeping track of the temporary callbacks that can
63 // be used in vkCreateInstance and vkDestroyInstance:
64 uint32_t num_tmp_callbacks;
65 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
66 VkDebugReportCallbackEXT *tmp_callbacks;
67
Jon Ashburn5484e0c2016-03-08 17:48:44 -070068 // TODO: Split instance/device structs
69 // Device Data
70 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060071 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Mark Lobodzinskia4932512016-06-27 15:13:00 -060072 VkPhysicalDeviceLimits device_limits;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060073 VkPhysicalDeviceFeatures physical_device_features;
74 VkPhysicalDevice physical_device;
Michael Lentinebdf744f2016-01-27 15:43:43 -060075
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060076 bool wsi_enabled;
Mark Youngead9b932016-09-08 12:28:38 -060077 bool wsi_display_swapchain_enabled;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060078
Mark Lobodzinskia4932512016-06-27 15:13:00 -060079 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060080 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
Mark Youngead9b932016-09-08 12:28:38 -060081 physical_device_features{}, physical_device{}, wsi_enabled(false), wsi_display_swapchain_enabled(false) {};
Cody Northrop55443ef2015-09-28 15:09:32 -060082};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060084static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070085static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060086static device_table_map pc_device_table_map;
87static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060088
Jeremy Hayes99a96322015-06-26 12:48:09 -060089// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070090debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060091 dispatch_key key = get_dispatch_key(object);
92 layer_data *data = get_my_data_ptr(key, layer_data_map);
93#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060094 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 -060095#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060096 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060097 return data->report_data;
98}
99
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600100static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600101
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600102 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600103}
104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600105VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
106 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
107 const VkAllocationCallbacks *pAllocator,
108 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700109 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700110 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600111
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700112 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700113 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600114 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600115 }
116
117 return result;
118}
119
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600120VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800121 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700122 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700123 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600124
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700125 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700126 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600127}
128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600129VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
130 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
131 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700132 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
133 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700134}
135
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700136static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600137
Chia-I Wu3384db82016-05-16 07:30:58 +0800138static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600139 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800140};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700141
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700142static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600143 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700144 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
145 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
146 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
147 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
148 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 -0700149 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700150 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600151 return false;
152 }
153
154 return true;
155}
156
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700157static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
158 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600159 return "unrecognized enumerator";
160 }
161
162 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700163 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600164 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
165 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600167 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600185 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
192 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800194 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600195 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800197 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600198 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700200 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
201 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600202
203 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700204 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600205 enumeratorString += string;
206
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700207 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600208 enumeratorString += '|';
209 }
210 }
211
212 return enumeratorString;
213}
214
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700215static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
216 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
217 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
218 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
219 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
220 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600221 return false;
222 }
223
224 return true;
225}
226
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700227static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
228 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600229 return "unrecognized enumerator";
230 }
231
232 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700233 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600234 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
235 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700236 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600237 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600238 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600240 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
241 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700242 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
244 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
247 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800249 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600250 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
253 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800255 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600256 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600257
258 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700259 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600260 enumeratorString += string;
261
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263 enumeratorString += '|';
264 }
265 }
266
267 return enumeratorString;
268}
269
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700270static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
271 VkQueueFlagBits allFlags =
272 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
273 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600274 return false;
275 }
276
277 return true;
278}
279
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700280static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
281 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600282 return "unrecognized enumerator";
283 }
284
285 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800287 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600288 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600290 strings.push_back("VK_QUEUE_COMPUTE_BIT");
291 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800293 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600294 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600296 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
297 }
298
299 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700300 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600301 enumeratorString += string;
302
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700303 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600304 enumeratorString += '|';
305 }
306 }
307
308 return enumeratorString;
309}
310
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700311static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
312 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
313 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
314 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
315 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600316 return false;
317 }
318
319 return true;
320}
321
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700322static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
323 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 return "unrecognized enumerator";
325 }
326
327 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700328 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600329 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
330 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800332 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600333 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600335 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
336 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800338 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600339 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800341 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600342 }
343
344 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700345 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600346 enumeratorString += string;
347
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700348 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600349 enumeratorString += '|';
350 }
351 }
352
353 return enumeratorString;
354}
355
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700357 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700358 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600359 return false;
360 }
361
362 return true;
363}
364
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
366 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600367 return "unrecognized enumerator";
368 }
369
370 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700371 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800372 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600373 }
374
375 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700376 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600377 enumeratorString += string;
378
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700379 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600380 enumeratorString += '|';
381 }
382 }
383
384 return enumeratorString;
385}
386
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700387static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
388 VkSparseImageFormatFlagBits allFlags =
389 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
390 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
391 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600392 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600393 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600394
395 return true;
396}
397
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700398static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
399 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600400 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600401 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402
403 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800405 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600406 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800408 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600409 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700410 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800411 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600413
414 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700415 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600416 enumeratorString += string;
417
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700418 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600419 enumeratorString += '|';
420 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600421 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422
423 return enumeratorString;
424}
425
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700426static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700427 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700428 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600429 return false;
430 }
431
432 return true;
433}
434
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
436 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600437 return "unrecognized enumerator";
438 }
439
440 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700441 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600442 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
443 }
444
445 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700446 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600447 enumeratorString += string;
448
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700449 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600450 enumeratorString += '|';
451 }
452 }
453
454 return enumeratorString;
455}
456
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700457static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
458 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
459 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
460 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
461 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
462 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600463 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
464 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
465 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700466 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600467 return false;
468 }
469
470 return true;
471}
472
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700473static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
474 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600475 return "unrecognized enumerator";
476 }
477
478 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700479 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700480 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600481 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700483 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600484 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700485 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700486 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600502 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700504 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600505 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700507 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600508 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700510 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600511 }
512
513 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700514 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515 enumeratorString += string;
516
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700517 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 enumeratorString += '|';
519 }
520 }
521
522 return enumeratorString;
523}
524
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700525static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
526 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
527 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
528 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600529 return false;
530 }
531
532 return true;
533}
534
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700535static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
536 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600537 return "unrecognized enumerator";
538 }
539
540 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700541 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600542 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
543 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600545 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
546 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700547 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600548 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
549 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600551 strings.push_back("VK_QUERY_RESULT_64_BIT");
552 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600553
554 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700555 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600556 enumeratorString += string;
557
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700558 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600559 enumeratorString += '|';
560 }
561 }
562
563 return enumeratorString;
564}
565
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700566static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
567 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
568 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
569 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
570 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
571 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600572 return false;
573 }
574
575 return true;
576}
577
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
579 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600580 return "unrecognized enumerator";
581 }
582
583 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700584 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600585 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
586 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600588 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
589 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600591 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
592 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800600 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600601 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
604 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800606 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600607 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700608 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600609 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
610 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600611
612 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700613 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614 enumeratorString += string;
615
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700616 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617 enumeratorString += '|';
618 }
619 }
620
621 return enumeratorString;
622}
623
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700624static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
625 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
626 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
627 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600628 return false;
629 }
630
631 return true;
632}
633
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700634static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
635 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600636 return "unrecognized enumerator";
637 }
638
639 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700640 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600641 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
642 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600644 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
645 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700646 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600647 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600648 }
649
650 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700651 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600652 enumeratorString += string;
653
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700654 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600655 enumeratorString += '|';
656 }
657 }
658
659 return enumeratorString;
660}
661
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700662static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
663 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
664 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
665 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
666 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600667 return false;
668 }
669
670 return true;
671}
672
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700673static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
674 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600675 return "unrecognized enumerator";
676 }
677
678 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700679 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600680 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
681 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600683 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
684 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600686 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
687 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600689 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
690 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700691 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600692 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600693 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600694
695 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700696 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600697 enumeratorString += string;
698
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700699 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 enumeratorString += '|';
701 }
702 }
703
704 return enumeratorString;
705}
706
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700707static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
708 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
709 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
710 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600711 return false;
712 }
713
714 return true;
715}
716
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700717static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
718 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600719 return "unrecognized enumerator";
720 }
721
722 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700723 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800724 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600725 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800727 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600728 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700729 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800730 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600731 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700732 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800733 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600734 }
735
736 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700737 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600738 enumeratorString += string;
739
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700740 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600741 enumeratorString += '|';
742 }
743 }
744
745 return enumeratorString;
746}
747
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700748static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
749 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
750 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
751 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600752 return false;
753 }
754
755 return true;
756}
757
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700758static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
759 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600760 return "unrecognized enumerator";
761 }
762
763 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700764 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600765 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
766 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700767 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600768 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
769 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700770 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600771 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600772 }
773
774 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700775 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600776 enumeratorString += string;
777
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700778 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600779 enumeratorString += '|';
780 }
781 }
782
783 return enumeratorString;
784}
785
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700786static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
787 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
788 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
789 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
790 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600791 return false;
792 }
793
794 return true;
795}
796
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700797static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
798 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600799 return "unrecognized enumerator";
800 }
801
802 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700803 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600804 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600805 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600807 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600808 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700809 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600810 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
811 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
814 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600816 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600817 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600819 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600820 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600822 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600823 }
824
825 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700826 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600827 enumeratorString += string;
828
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600830 enumeratorString += '|';
831 }
832 }
833
834 return enumeratorString;
835}
836
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700837static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800838 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700839 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
840 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
841 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
842 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
843 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
844 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 -0700845 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700846 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600847 return false;
848 }
849
850 return true;
851}
852
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700853static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
854 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600855 return "unrecognized enumerator";
856 }
857
858 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700859 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800860 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
861 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800863 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600864 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600866 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600867 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600869 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700875 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600881 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600884 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600887 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700896 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600899 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
900 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600902 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
903 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600905 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
906 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700907 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600908 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600909 }
910
911 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700912 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600913 enumeratorString += string;
914
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700915 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600916 enumeratorString += '|';
917 }
918 }
919
920 return enumeratorString;
921}
922
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700923static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800924 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700925 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
926 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
927 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
928 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
929 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 +0800930
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700931 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600932 return false;
933 }
934
935 return true;
936}
937
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700938static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
939 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600940 return "unrecognized enumerator";
941 }
942
943 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700944 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800945 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600946 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700947 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800948 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600949 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800951 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600952 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600985 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800987 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600988 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800990 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600991 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700992 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800993 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600994 }
995
996 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700997 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600998 enumeratorString += string;
999
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001000 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001001 enumeratorString += '|';
1002 }
1003 }
1004
1005 return enumeratorString;
1006}
1007
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1009 VkCommandPoolCreateFlagBits allFlags =
1010 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1011 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001012 return false;
1013 }
1014
1015 return true;
1016}
1017
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1019 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001020 return "unrecognized enumerator";
1021 }
1022
1023 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001024 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001025 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001026 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001027 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001028 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001029 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001030
1031 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001032 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001033 enumeratorString += string;
1034
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001035 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001036 enumeratorString += '|';
1037 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001038 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039
1040 return enumeratorString;
1041}
1042
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001044 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001045 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001046 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001047 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001048
1049 return true;
1050}
1051
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1053 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001054 return "unrecognized enumerator";
1055 }
1056
1057 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001058 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001059 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001060 }
1061
1062 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001063 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001064 enumeratorString += string;
1065
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001066 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001067 enumeratorString += '|';
1068 }
1069 }
1070
1071 return enumeratorString;
1072}
1073
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001074static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1075 VkCommandBufferUsageFlags allFlags =
1076 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1077 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1078 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001079 return false;
1080 }
1081
1082 return true;
1083}
1084
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001085static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1086 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001087 return "unrecognized enumerator";
1088 }
1089
1090 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001092 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001093 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001095 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001096 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001097 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001098 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001099 }
1100
1101 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001102 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001103 enumeratorString += string;
1104
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001105 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001106 enumeratorString += '|';
1107 }
1108 }
1109
1110 return enumeratorString;
1111}
1112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001113static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001114 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001115 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001116 return false;
1117 }
1118
1119 return true;
1120}
1121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1123 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001124 return "unrecognized enumerator";
1125 }
1126
1127 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001128 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001129 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001130 }
1131
1132 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001133 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001134 enumeratorString += string;
1135
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001136 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001137 enumeratorString += '|';
1138 }
1139 }
1140
1141 return enumeratorString;
1142}
1143
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001144static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1145 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1146 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1147 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001148 return false;
1149 }
1150
1151 return true;
1152}
1153
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001154static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1155 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001156 return "unrecognized enumerator";
1157 }
1158
1159 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001160 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001161 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1162 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001164 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1165 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001166 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001169 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1171 }
1172
1173 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001174 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001175 enumeratorString += string;
1176
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001177 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001178 enumeratorString += '|';
1179 }
1180 }
1181
1182 return enumeratorString;
1183}
1184
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001186 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001187 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001188 return false;
1189 }
1190
1191 return true;
1192}
1193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1195 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001196 return "unrecognized enumerator";
1197 }
1198
1199 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001200 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001201 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001202 }
1203
1204 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001205 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001206 enumeratorString += string;
1207
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001208 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001209 enumeratorString += '|';
1210 }
1211 }
1212
1213 return enumeratorString;
1214}
1215
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001216static const int MaxParamCheckerStringLength = 256;
1217
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001218static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001219 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001220 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001221 assert(validateString != nullptr);
1222
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001223 bool skip_call = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001224
1225 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1226
1227 if (result == VK_STRING_ERROR_NONE) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001228 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001229 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001230
1231 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1232 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1233 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001234 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001235 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1236 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1237 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001238 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001239 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001240}
1241
Dustin Gravesde628532016-04-21 16:30:17 -06001242static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1243 uint32_t index) {
1244 assert(device_data != nullptr);
1245 debug_report_data *report_data = device_data->report_data;
1246 bool skip_call = false;
1247
1248 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001249 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1250 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001251 } else {
1252 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1253 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1254 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001255 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1256 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001257 function_name, parameter_name, index);
1258 return false;
1259 }
1260 }
1261
1262 return skip_call;
1263}
1264
1265static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1266 const uint32_t count, const uint32_t *indices) {
1267 assert(device_data != nullptr);
1268 debug_report_data *report_data = device_data->report_data;
1269 bool skip_call = false;
1270
1271 if (indices != nullptr) {
1272 for (uint32_t i = 0; i < count; i++) {
1273 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001274 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1275 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001276 } else {
1277 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1278 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1279 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001280 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1281 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001282 function_name, parameter_name, i, indices[i]);
1283 return false;
1284 }
1285 }
1286 }
1287 }
1288
1289 return skip_call;
1290}
1291
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001292static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1293
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001294VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1295 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001296 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001297
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001298 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001299 assert(chain_info != nullptr);
1300 assert(chain_info->u.pLayerInfo != nullptr);
1301
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001302 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1303 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001304 if (fpCreateInstance == NULL) {
1305 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001306 }
1307
Dustin Graves842621d2016-03-03 14:17:08 -07001308 // Advance the link info for the next element on the chain
1309 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1310
1311 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001312
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001313 if (result == VK_SUCCESS) {
1314 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1315 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001316
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001317 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001318
Chia-I Wua570b7c2016-05-16 07:48:14 +08001319 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001320 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1321 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001322
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001323 // Look for one or more debug report create info structures
1324 // and setup a callback(s) for each one found.
1325 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1326 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1327 if (my_instance_data->num_tmp_callbacks > 0) {
1328 // Setup the temporary callback(s) here to catch early issues:
1329 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1330 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1331 // Failure of setting up one or more of the callback.
1332 // Therefore, clean up and don't use those callbacks:
1333 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1334 my_instance_data->num_tmp_callbacks = 0;
1335 }
1336 }
1337 }
1338
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001339 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001340 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001341
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001342 // Ordinarily we'd check these before calling down the chain, but none of the layer
1343 // support is in place until now, if we survive we can report the issue now.
1344 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001345
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001346 if (pCreateInfo->pApplicationInfo) {
1347 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1348 validate_string(my_instance_data->report_data, "vkCreateInstance",
1349 "pCreateInfo->VkApplicationInfo->pApplicationName",
1350 pCreateInfo->pApplicationInfo->pApplicationName);
1351 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001352
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001353 if (pCreateInfo->pApplicationInfo->pEngineName) {
1354 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1355 pCreateInfo->pApplicationInfo->pEngineName);
1356 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001357 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001358
1359 // Disable the tmp callbacks:
1360 if (my_instance_data->num_tmp_callbacks > 0) {
1361 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1362 my_instance_data->tmp_callbacks);
1363 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001364 }
1365
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001366 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001367}
1368
Chia-I Wu01ca2372016-05-13 14:37:49 +08001369VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001370 // Grab the key before the instance is destroyed.
1371 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001372 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001373 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001374 assert(my_data != NULL);
1375
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001376 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1377 bool callback_setup = false;
1378 if (my_data->num_tmp_callbacks > 0) {
1379 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1380 my_data->tmp_callbacks)) {
1381 callback_setup = true;
1382 }
1383 }
1384
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001385 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001386
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001387 // Disable and cleanup the temporary callback(s):
1388 if (callback_setup) {
1389 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1390 }
1391 if (my_data->num_tmp_callbacks > 0) {
1392 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1393 my_data->num_tmp_callbacks = 0;
1394 }
1395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001396 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001397 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001398 pTable->DestroyInstance(instance, pAllocator);
1399
1400 // Clean up logging callback, if any
1401 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001402 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1403 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001404 my_data->logging_callback.pop_back();
1405 }
1406
Chris Forbes78a56b02016-11-02 16:13:01 +13001407 layer_debug_report_destroy_instance(my_data->report_data);
Dustin Graves27a912a2016-03-07 17:52:14 -07001408 layer_data_map.erase(pTable);
1409
1410 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001411 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001412 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001413}
1414
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001415VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1416 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001417 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001418 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001419 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001420 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001422 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001423
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001424 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001425 result = get_dispatch_table(pc_instance_table_map, instance)
1426 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001427
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001428 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001429 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1430 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1431 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1432 // Save the supported features for each physical device
1433 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1434 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1435 }
1436 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001437 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001438 return result;
1439}
1440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001441VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1442 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001443 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001444 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001446 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001448 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001451}
1452
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001453VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1454 VkFormatProperties *pFormatProperties) {
1455 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001456 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001457 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001459 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001460
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001461 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001462 get_dispatch_table(pc_instance_table_map, physicalDevice)
1463 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001465}
1466
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001467VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1468 VkImageType type, VkImageTiling tiling,
1469 VkImageUsageFlags usage, VkImageCreateFlags flags,
1470 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001471 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001472 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001474 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001476 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1477 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001478
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001479 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001480 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1481 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1482 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001483
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001484 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485 }
Chia-I Wu17241042015-10-31 00:31:16 +08001486
1487 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001488}
1489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001490VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1491 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001494
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001495 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001497 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001498 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001499 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001500}
1501
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001502VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1503 uint32_t *pQueueFamilyPropertyCount,
1504 VkQueueFamilyProperties *pQueueFamilyProperties) {
1505 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001506 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001507 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001509 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1510 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001511
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001512 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001513 get_dispatch_table(pc_instance_table_map, physicalDevice)
1514 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001515 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001516}
1517
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001518VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1519 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1520 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001521 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001522 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001523
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001524 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001525
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001526 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001527 get_dispatch_table(pc_instance_table_map, physicalDevice)
1528 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001529 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001530}
1531
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001532void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1533 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001534 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001535
1536 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1537 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1538 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001539 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 -06001540 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001541 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1542 "structure.",
1543 i);
1544 } else {
1545 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001546 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001547
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001548 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1549 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1550 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1551 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001552 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 -06001553 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001554 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1555 "between 0 and 1. Actual value is %f",
1556 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1557 }
1558 }
1559 }
1560
1561 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1562 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001563 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001564 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001565 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1566 "of queue families.",
1567 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001568 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1569 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1570 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001571 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001572 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001573 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1574 "queues for the given family index.",
1575 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001576 }
Michael Lentine774704f2016-01-27 13:36:46 -06001577 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001578 }
1579}
1580
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001581static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001582 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001583
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001584 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001585
1586 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1587 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001588 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001589 }
1590#ifdef VK_USE_PLATFORM_XLIB_KHR
1591 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001592 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001593 }
1594#endif
1595#ifdef VK_USE_PLATFORM_XCB_KHR
1596 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001597 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001598 }
1599#endif
1600#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1601 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001602 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001603 }
1604#endif
1605#ifdef VK_USE_PLATFORM_MIR_KHR
1606 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001607 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001608 }
1609#endif
1610#ifdef VK_USE_PLATFORM_ANDROID_KHR
1611 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001612 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001613 }
1614#endif
1615#ifdef VK_USE_PLATFORM_WIN32_KHR
1616 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001617 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001618 }
1619#endif
1620 }
1621}
1622
1623static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1624 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1625 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06001626 device_data->wsi_display_swapchain_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001627
1628 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1629 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1630 device_data->wsi_enabled = true;
1631 }
Mark Youngead9b932016-09-08 12:28:38 -06001632 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
1633 device_data->wsi_display_swapchain_enabled = true;
1634 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001635 }
1636}
1637
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001638void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001639 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001640
1641 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1642 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1643 my_device_data->queueFamilyIndexMap.insert(
1644 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1645 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001646 }
1647}
1648
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001649VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001650 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001651 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001652 * NOTE: We do not validate physicalDevice or any dispatchable
1653 * object as the first parameter. We couldn't get here if it was wrong!
1654 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001655
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001656 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001657 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001658 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001659 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001661 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001662
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001663 if (pCreateInfo != NULL) {
1664 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001665 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001666 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1667 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001668 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001669 }
Michael Lentine774704f2016-01-27 13:36:46 -06001670
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001671 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001672 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001673 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1674 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001675 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001676 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001677 }
1678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001679 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001680 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001681 assert(chain_info != nullptr);
1682 assert(chain_info->u.pLayerInfo != nullptr);
1683
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001684 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1685 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001686 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001687 if (fpCreateDevice == NULL) {
1688 return VK_ERROR_INITIALIZATION_FAILED;
1689 }
1690
1691 // Advance the link info for the next element on the chain
1692 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1693
1694 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001695
1696 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1697
1698 if (result == VK_SUCCESS) {
1699 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1700 assert(my_device_data != nullptr);
1701
1702 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1703 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1704
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001705 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1706
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001707 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001708 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1709 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001710 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001711 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001712
1713 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1714 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001715
1716 // Query and save physical device limits for this device
1717 VkPhysicalDeviceProperties device_properties = {};
1718 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1719 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001720 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001721
1722 // Save app-enabled features in this device's layer_data structure
1723 if (pCreateInfo->pEnabledFeatures) {
1724 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1725 } else {
1726 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1727 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001728 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001729 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001730
Jeremy Hayes99a96322015-06-26 12:48:09 -06001731 return result;
1732}
1733
Chia-I Wu01ca2372016-05-13 14:37:49 +08001734VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001735 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001736 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001737 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1738 assert(my_data != NULL);
1739
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001740 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001742 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001743 layer_debug_report_destroy_device(device);
1744
Jeremy Hayes99a96322015-06-26 12:48:09 -06001745#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001746 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001747#endif
1748
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001749 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001750 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001751 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001752 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001753}
1754
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001755bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001756 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001757 assert(my_device_data != nullptr);
1758
Dustin Gravesde628532016-04-21 16:30:17 -06001759 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001760
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001761 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001762 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001763 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 -06001764 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001765 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1766 "was created.",
1767 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001768 return false;
1769 }
1770 return true;
1771}
1772
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001773VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1774 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001776 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001778 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001779
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001780 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001781 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1782
1783 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001784 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001785}
1786
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001787VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001788 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001789 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001790 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001791 assert(my_data != NULL);
1792
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001793 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001794
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001795 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001796 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1797
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001798 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001799 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001800
Jeremy Hayes99a96322015-06-26 12:48:09 -06001801 return result;
1802}
1803
Chia-I Wu01ca2372016-05-13 14:37:49 +08001804VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001805 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1806 assert(my_data != NULL);
1807
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001808 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001809
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001810 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001811
1812 return result;
1813}
1814
Chia-I Wu01ca2372016-05-13 14:37:49 +08001815VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001816 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), 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, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001820
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001821 validate_result(my_data->report_data, "vkDeviceWaitIdle", 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 AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001827 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001828 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001829 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001830 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001831 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001832
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001833 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001834
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001835 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001836 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1837
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001838 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001839 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001840
1841 return result;
1842}
1843
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001844VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1845 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001846 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001847 assert(my_data != NULL);
1848
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001849 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001850
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001851 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001852 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001853 }
1854}
1855
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001856VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1857 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001858 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001859 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001860 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001861 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001862
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001863 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001864
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001865 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001866 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1867
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001868 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001869 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001870
1871 return result;
1872}
1873
Chia-I Wu01ca2372016-05-13 14:37:49 +08001874VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001875 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001876 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1877 assert(my_data != NULL);
1878
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001879 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001880
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001881 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001882 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1883 }
1884}
1885
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001886VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1887 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001888 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001889 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001890 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001891 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001892
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001893 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001894
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001895 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001896 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1897
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001898 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001900
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001901 return result;
1902}
1903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001904VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1905 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001906 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001907 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001908 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001909 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001910
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001911 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001912
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001913 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001914 result =
1915 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001916
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001917 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001918 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001919
Tony Barbourb1250542015-04-16 19:23:13 -06001920 return result;
1921}
1922
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001923VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1924 VkDeviceSize *pCommittedMemoryInBytes) {
1925 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001926 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001928
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001929 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001930
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001931 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001932 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001933 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001934}
1935
Chia-I Wu01ca2372016-05-13 14:37:49 +08001936VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1937 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001938 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001939 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001940 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1941 assert(my_data != NULL);
1942
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001943 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001944
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001945 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001946 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1947
1948 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1949 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001950
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001951 return result;
1952}
1953
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001954VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001955 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001956 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001957 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1958 assert(my_data != NULL);
1959
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001960 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001961
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001962 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001963 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1964
1965 validate_result(my_data->report_data, "vkBindImageMemory", result);
1966 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001967
1968 return result;
1969}
1970
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001971VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1972 VkMemoryRequirements *pMemoryRequirements) {
1973 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001974 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001975 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001976
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001977 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001979 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001980 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001981 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001982}
1983
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001984VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1985 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001987 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001988
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001989 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001990
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001991 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001992 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994}
1995
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1997 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1998 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001999 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002000 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2001 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002002 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 -06002003 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002004 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2005 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002006 return false;
2007 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002008 }
2009
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002010 return true;
2011}
2012
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002013VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2014 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2015 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002016 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002017 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002018
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002019 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2020 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002021
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002022 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002023 get_dispatch_table(pc_device_table_map, device)
2024 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002025
2026 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2027 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002028}
2029
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002030bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2031 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2032 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002033 if (pProperties != nullptr) {
2034 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2035 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002036 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 -06002037 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002038 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2039 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002040 return false;
2041 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002042 }
2043
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002044 return true;
2045}
2046
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002047VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2048 VkImageType type, VkSampleCountFlagBits samples,
2049 VkImageUsageFlags usage, VkImageTiling tiling,
2050 uint32_t *pPropertyCount,
2051 VkSparseImageFormatProperties *pProperties) {
2052 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002053 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002054 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002055
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002056 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2057 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002059 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002060 get_dispatch_table(pc_instance_table_map, physicalDevice)
2061 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2062 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002064 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2065 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002066 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002067}
2068
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002069VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2070 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002071 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002072 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002073 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002075
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002076 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002077
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002078 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2080
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002081 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002082 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002083
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002084 return result;
2085}
2086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002087VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2088 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002089 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002090 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002091 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002092 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002093
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002094 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002095
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002096 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002097 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2098
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002099 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002100 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002101
2102 return result;
2103}
2104
Chia-I Wu01ca2372016-05-13 14:37:49 +08002105VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002106 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002107 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002108 assert(my_data != NULL);
2109
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002110 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002112 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002113 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002114 }
2115}
2116
Chia-I Wu01ca2372016-05-13 14:37:49 +08002117VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002118 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002119 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002120 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002121 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002122
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002123 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002124
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002125 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002126 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2127
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002128 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002129 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002130
2131 return result;
2132}
2133
Chia-I Wu01ca2372016-05-13 14:37:49 +08002134VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002135 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002136 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2138 assert(my_data != NULL);
2139
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002140 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002141
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002142 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002143 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2144
2145 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2146 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002147
2148 return result;
2149}
2150
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002151VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2152 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002153 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002154 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002155 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002156 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002157
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002158 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002160 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2162
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002163 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002164 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002165
2166 return result;
2167}
2168
Chia-I Wu01ca2372016-05-13 14:37:49 +08002169VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002170 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002171 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002172 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002173 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002174 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002175
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002176 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002177
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002178 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002179 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2180
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002181 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002182 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002183
2184 return result;
2185}
2186
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002187VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2188 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002189 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002190 assert(my_data != NULL);
2191
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002192 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002193
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002194 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002195 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002196 }
2197}
2198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002199VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2200 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002201 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002202 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002203 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002204 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002205
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002206 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002207
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002208 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002209 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2210
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002211 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002212 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002213
2214 return result;
2215}
2216
Chia-I Wu01ca2372016-05-13 14:37:49 +08002217VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002218 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002219 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002220 assert(my_data != NULL);
2221
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002222 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002223
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002224 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002225 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002226 }
2227}
2228
Chia-I Wu01ca2372016-05-13 14:37:49 +08002229VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002230 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002231 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002232 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2233 assert(my_data != NULL);
2234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002235 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002236
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002237 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002238 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2239
2240 validate_result(my_data->report_data, "vkGetEventStatus", result);
2241 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242
2243 return result;
2244}
2245
Chia-I Wu01ca2372016-05-13 14:37:49 +08002246VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002247 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002248 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2250 assert(my_data != NULL);
2251
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002252 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002253
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002254 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002255 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2256
2257 validate_result(my_data->report_data, "vkSetEvent", result);
2258 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002259
2260 return result;
2261}
2262
Chia-I Wu01ca2372016-05-13 14:37:49 +08002263VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002264 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002265 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002266 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2267 assert(my_data != NULL);
2268
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002269 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002270
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002271 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002272 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2273
2274 validate_result(my_data->report_data, "vkResetEvent", result);
2275 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002276
2277 return result;
2278}
2279
Chia-I Wu01ca2372016-05-13 14:37:49 +08002280VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002281 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002282 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002283 bool skip_call = false;
2284 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2285 assert(device_data != nullptr);
2286 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002287
Dustin Gravesc900f572016-05-16 11:07:59 -06002288 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002289
Dustin Gravesc900f572016-05-16 11:07:59 -06002290 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2291 if (pCreateInfo != nullptr) {
2292 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2293 // VkQueryPipelineStatisticFlagBits values
2294 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2295 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2296 skip_call |=
2297 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2298 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2299 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2300 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2301 }
2302 }
2303
2304 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002305 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2306
Dustin Gravesc900f572016-05-16 11:07:59 -06002307 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002308 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002309
2310 return result;
2311}
2312
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002313VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2314 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002315 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002316 assert(my_data != NULL);
2317
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002318 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002319
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002320 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002321 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002322 }
2323}
2324
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002325VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2326 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002328 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002329 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002330 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002331
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002332 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2333 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002334
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002335 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002336 result = get_dispatch_table(pc_device_table_map, device)
2337 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002338
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002339 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002340 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002341
2342 return result;
2343}
2344
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002345VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2346 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002347 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002348 bool skip_call = false;
2349 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2350 assert(device_data != nullptr);
2351 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002352
Karl Schultza9ef1e52016-10-06 17:53:48 -06002353 // TODO: Add check for VALIDATION_ERROR_00660
2354 // TODO: Add check for VALIDATION_ERROR_00661
2355 // TODO: Add check for VALIDATION_ERROR_00662
2356 // TODO: Add check for VALIDATION_ERROR_00670
2357 // TODO: Add check for VALIDATION_ERROR_00671
2358 // TODO: Add check for VALIDATION_ERROR_00672
2359 // TODO: Add check for VALIDATION_ERROR_00673
2360 // TODO: Add check for VALIDATION_ERROR_00674
2361 // TODO: Add check for VALIDATION_ERROR_00675
2362 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2363 // TODO: Add check for VALIDATION_ERROR_00663
Dustin Gravesc900f572016-05-16 11:07:59 -06002364 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002365
Dustin Gravesc900f572016-05-16 11:07:59 -06002366 if (pCreateInfo != nullptr) {
2367 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2368 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2369 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2370 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Karl Schultza9ef1e52016-10-06 17:53:48 -06002371 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2372 __LINE__, VALIDATION_ERROR_00665, LayerName,
2373 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2374 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2375 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002376 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002377
Dustin Gravesc900f572016-05-16 11:07:59 -06002378 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2379 // queueFamilyIndexCount uint32_t values
2380 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2381 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 -06002382 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002383 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2384 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002385 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2386 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002387 }
2388
2389 // Ensure that the queue family indices were specified at device creation
2390 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2391 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2392 }
2393 }
2394
2395 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002396 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2397
Dustin Gravesc900f572016-05-16 11:07:59 -06002398 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002399 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002400
2401 return result;
2402}
2403
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002404VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2405 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002406 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002407 assert(my_data != NULL);
2408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002409 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002410
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002411 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002412 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002413 }
2414}
2415
Chia-I Wu01ca2372016-05-13 14:37:49 +08002416VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2417 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002418 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002419 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002421 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002423 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002425 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002426 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2427
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002428 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002429 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002430
2431 return result;
2432}
2433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002434VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2435 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002436 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002437 assert(my_data != NULL);
2438
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002439 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002441 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002442 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002443 }
2444}
2445
Chia-I Wu01ca2372016-05-13 14:37:49 +08002446VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2447 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002448 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2449 bool skip_call = false;
2450 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002451 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002452 debug_report_data *report_data = device_data->report_data;
2453
2454 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2455
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002456 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002457 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002458 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002459 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2460 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2461 skip_call |=
2462 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2463 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2464 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2465 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002466
Dustin Gravesc900f572016-05-16 11:07:59 -06002467 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2468 // queueFamilyIndexCount uint32_t values
2469 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2470 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2471 __LINE__, REQUIRED_PARAMETER, LayerName,
2472 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2473 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2474 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2475 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002476
2477 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2478 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2479 }
2480
2481 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002482 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2483 skip_call |=
2484 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2485 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002486
2487 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002488 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002489
2490 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002491 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002492
2493 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2494 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2495 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2496 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002497 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002498 }
2499
2500 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2501 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2502 // extent.height must be equal
2503 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2504 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002505 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2506 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2507 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2508 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002509 }
2510
2511 if (pCreateInfo->extent.depth != 1) {
2512 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002513 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002514 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2515 }
2516 }
2517
2518 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2519 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2520 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002521 skip_call |=
2522 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2523 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2524 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002525 }
2526
2527 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2528 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2529 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2530 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002531 skip_call |=
2532 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2533 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2534 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002535 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002536 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002537
Dustin Gravesf8032f22016-05-11 18:31:44 -06002538 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002539 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2540
Dustin Gravesf8032f22016-05-11 18:31:44 -06002541 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002542 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002543
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002544 return result;
2545}
2546
Chia-I Wu01ca2372016-05-13 14:37:49 +08002547VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002548 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002549 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002550 assert(my_data != NULL);
2551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002552 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002554 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002555 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002556 }
2557}
2558
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002559bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2560 if (pSubresource != nullptr) {
2561 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2562 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002563 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 -06002564 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002565 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2566 return false;
2567 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002568 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002569
2570 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002571}
2572
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002573VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2574 VkSubresourceLayout *pLayout) {
2575 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002577 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002578
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002579 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002580
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002581 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002582 PreGetImageSubresourceLayout(device, pSubresource);
2583
2584 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002585 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002586}
2587
Chia-I Wu01ca2372016-05-13 14:37:49 +08002588VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2589 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002590 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002591 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002592 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002593 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002594 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002595
Dustin Graves0b70a632016-04-27 17:44:56 -06002596 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002597
Dustin Graves0b70a632016-04-27 17:44:56 -06002598 if (pCreateInfo != nullptr) {
2599 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002600 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2601 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002602 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2603 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2604 "pCreateInfo->subresourceRange.layerCount must be 1",
2605 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2606 }
2607 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002608 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2609 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2610 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002611 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2612 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2613 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2614 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2615 }
2616 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002617 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2618 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002619 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2620 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2621 "pCreateInfo->subresourceRange.layerCount must be 6");
2622 }
2623 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002624 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2625 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002626 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2627 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2628 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2629 }
2630 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2631 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2632 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2633 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2634 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2635 }
2636
Dustin Graves2a80dc62016-07-12 13:57:02 -06002637 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2638 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002639 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2640 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2641 "pCreateInfo->subresourceRange.layerCount must be 1");
2642 }
2643 }
2644 }
2645
2646 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002647 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2648
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002649 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002650 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002651
2652 return result;
2653}
2654
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002655VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2656 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002657 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002658 assert(my_data != NULL);
2659
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002660 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002661
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002662 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002663 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002664 }
2665}
2666
Chia-I Wu01ca2372016-05-13 14:37:49 +08002667VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002668 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002669 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002670 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002671 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002672 assert(my_data != NULL);
2673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002674 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002675
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002676 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002677 result =
2678 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002679
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002680 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002681 }
2682
Michael Lentine03d8e572015-09-15 14:59:14 -05002683 return result;
2684}
2685
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002686VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2687 const VkAllocationCallbacks *pAllocator) {
2688 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002689 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002690 assert(my_data != NULL);
2691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002692 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002694 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002695 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002696 }
2697}
2698
Chia-I Wu01ca2372016-05-13 14:37:49 +08002699VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002700 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002701 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002702 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002703 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002704 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002705
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002706 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002707
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002708 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002709 result =
2710 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002711
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002712 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002713 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002714
2715 return result;
2716}
2717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002718VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2719 const VkAllocationCallbacks *pAllocator) {
2720 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002721 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002722 assert(my_data != NULL);
2723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002724 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002726 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002727 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002728 }
2729}
2730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002731VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2732 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002733 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002734 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002735 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002736 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002738 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002739
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002740 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002741 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2742
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002743 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002744 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002745
2746 return result;
2747}
2748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002749VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2750 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002751 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002752 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002754 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002755
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002756 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002757
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002758 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002759 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2760
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002761 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002762 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002763
2764 return result;
2765}
2766
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002767bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002768 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2769
2770 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002771 if (pCreateInfos != nullptr) {
2772 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2773 if (pCreateInfos->basePipelineIndex != -1) {
2774 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002775 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 -06002776 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002777 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2778 "pCreateInfos->flags "
2779 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2780 return false;
2781 }
2782 }
2783
2784 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2785 if (pCreateInfos->basePipelineIndex != -1) {
2786 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002787 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002788 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002789 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2790 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2791 "VK_NULL_HANDLE");
2792 return false;
2793 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002794 }
2795 }
2796
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002797 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002798 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002799 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 -06002800 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002801 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2802 "unrecognized enumerator");
2803 return false;
2804 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002805
2806 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2807 (data->physical_device_features.fillModeNonSolid == false)) {
2808 log_msg(
2809 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2810 DEVICE_FEATURE, LayerName,
2811 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2812 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2813 return false;
2814 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002815 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002816
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002817 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002818 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002819 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2820 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002821 pCreateInfos[i].pStages[j].pName);
2822 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002823 }
2824
2825 return true;
2826}
2827
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002828VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2829 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2830 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002831 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002832 bool skip_call = false;
2833 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2834 assert(device_data != nullptr);
2835 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002836
Dustin Gravesc900f572016-05-16 11:07:59 -06002837 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2838 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002839
Dustin Gravesc900f572016-05-16 11:07:59 -06002840 if (pCreateInfos != nullptr) {
2841 for (uint32_t i = 0; i < createInfoCount; ++i) {
2842 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2843 if (pCreateInfos[i].pTessellationState == nullptr) {
2844 if (pCreateInfos[i].pStages != nullptr) {
2845 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2846 // pTessellationState must not be NULL
2847 bool has_control = false;
2848 bool has_eval = false;
2849
2850 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2851 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2852 has_control = true;
2853 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2854 has_eval = true;
2855 }
2856 }
2857
2858 if (has_control && has_eval) {
2859 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2860 __LINE__, REQUIRED_PARAMETER, LayerName,
2861 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2862 "control shader stage and a tessellation evaluation shader stage, "
2863 "pCreateInfos[%d].pTessellationState must not be NULL",
2864 i, i);
2865 }
2866 }
Dustin Graves629259b2016-05-30 16:14:27 -06002867 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002868 skip_call |= validate_struct_pnext(
2869 report_data, "vkCreateGraphicsPipelines",
2870 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2871 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002872
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002873 skip_call |= validate_reserved_flags(
2874 report_data, "vkCreateGraphicsPipelines",
2875 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2876 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002877
2878 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2879 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2880 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2881 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2882 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2883 i);
2884 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002885 }
2886
2887 if (pCreateInfos[i].pViewportState == nullptr) {
2888 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2889 // valid VkPipelineViewportStateCreateInfo structure
2890 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2891 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2892 skip_call |= log_msg(
2893 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2894 REQUIRED_PARAMETER, LayerName,
2895 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2896 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2897 i, i);
2898 }
2899 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002900 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002901 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2902 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2903 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002904
2905 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002906 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2907 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002908 pCreateInfos[i].pViewportState->flags);
2909
Dustin Gravesc900f572016-05-16 11:07:59 -06002910 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2911 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2912 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2913 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2914 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2915 i);
2916 }
2917
2918 if (pCreateInfos[i].pDynamicState != nullptr) {
2919 bool has_dynamic_viewport = false;
2920 bool has_dynamic_scissor = false;
2921
2922 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2923 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2924 has_dynamic_viewport = true;
2925 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2926 has_dynamic_scissor = true;
2927 }
2928 }
2929
2930 // viewportCount must be greater than 0
2931 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2932 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2933 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2934 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002935 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2936 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002937 "must be greater than 0",
2938 i, i);
2939 }
2940
2941 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2942 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2943 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2944 skip_call |=
2945 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2946 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002947 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002948 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2949 i, i);
2950 }
2951
2952 // scissorCount must be greater than 0
2953 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2954 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2955 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2956 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002957 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2958 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002959 "must be greater than 0",
2960 i, i);
2961 }
2962
2963 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2964 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2965 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2966 skip_call |=
2967 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2968 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002969 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002970 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2971 i, i);
2972 }
2973 }
2974 }
2975
2976 if (pCreateInfos[i].pMultisampleState == nullptr) {
2977 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2978 // a valid VkPipelineMultisampleStateCreateInfo structure
2979 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2980 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2981 skip_call |=
2982 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2983 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2984 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2985 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2986 i, i);
2987 }
Dustin Graves629259b2016-05-30 16:14:27 -06002988 } else {
2989 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002990 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2991 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002992 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002993
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002994 skip_call |= validate_reserved_flags(
2995 report_data, "vkCreateGraphicsPipelines",
2996 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2997 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002998
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002999 skip_call |= validate_bool32(
3000 report_data, "vkCreateGraphicsPipelines",
3001 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3002 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003003
3004 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003005 report_data, "vkCreateGraphicsPipelines",
3006 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3007 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3008 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3009 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003010
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003011 skip_call |= validate_bool32(
3012 report_data, "vkCreateGraphicsPipelines",
3013 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3014 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003015
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003016 skip_call |= validate_bool32(
3017 report_data, "vkCreateGraphicsPipelines",
3018 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3019 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003020
3021 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3022 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3023 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3024 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3025 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3026 i);
3027 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003028 }
3029
3030 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003031 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003032 skip_call |= validate_struct_pnext(
3033 report_data, "vkCreateGraphicsPipelines",
3034 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3035 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003036
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003037 skip_call |= validate_reserved_flags(
3038 report_data, "vkCreateGraphicsPipelines",
3039 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3040 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003041
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003042 skip_call |= validate_bool32(
3043 report_data, "vkCreateGraphicsPipelines",
3044 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3045 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003046
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003047 skip_call |= validate_bool32(
3048 report_data, "vkCreateGraphicsPipelines",
3049 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3050 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003051
3052 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003053 report_data, "vkCreateGraphicsPipelines",
3054 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3055 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3056 pCreateInfos[i].pDepthStencilState->depthCompareOp);
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->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3061 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003062
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003063 skip_call |= validate_bool32(
3064 report_data, "vkCreateGraphicsPipelines",
3065 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3066 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003067
3068 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003069 report_data, "vkCreateGraphicsPipelines",
3070 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3071 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3072 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003073
3074 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003075 report_data, "vkCreateGraphicsPipelines",
3076 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3077 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3078 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003079
3080 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003081 report_data, "vkCreateGraphicsPipelines",
3082 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3083 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3084 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003085
3086 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003087 report_data, "vkCreateGraphicsPipelines",
3088 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3089 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3090 pCreateInfos[i].pDepthStencilState->front.compareOp);
3091
3092 skip_call |= validate_ranged_enum(
3093 report_data, "vkCreateGraphicsPipelines",
3094 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003095 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3096
3097 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003098 report_data, "vkCreateGraphicsPipelines",
3099 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003100 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3101
3102 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003103 report_data, "vkCreateGraphicsPipelines",
3104 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3105 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3106 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003107
3108 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003109 report_data, "vkCreateGraphicsPipelines",
3110 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3111 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3112 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003113
3114 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3115 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3116 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3117 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3118 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3119 i);
3120 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003121 }
3122
3123 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3124 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003125 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003126 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3127 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3128 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003129
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003130 skip_call |= validate_reserved_flags(
3131 report_data, "vkCreateGraphicsPipelines",
3132 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3133 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003134
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003135 skip_call |= validate_bool32(
3136 report_data, "vkCreateGraphicsPipelines",
3137 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3138 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003139
3140 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003141 report_data, "vkCreateGraphicsPipelines",
3142 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3143 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3144 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003145
3146 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3147 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3148 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003149 skip_call |=
3150 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3151 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3152 ParameterName::IndexVector{i, attachmentIndex}),
3153 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003154
3155 skip_call |= validate_ranged_enum(
3156 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003157 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3158 ParameterName::IndexVector{i, attachmentIndex}),
3159 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003160 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3161
3162 skip_call |= validate_ranged_enum(
3163 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003164 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3165 ParameterName::IndexVector{i, attachmentIndex}),
3166 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003167 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3168
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003169 skip_call |=
3170 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3171 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3172 ParameterName::IndexVector{i, attachmentIndex}),
3173 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3174 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003175
3176 skip_call |= validate_ranged_enum(
3177 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003178 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3179 ParameterName::IndexVector{i, attachmentIndex}),
3180 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003181 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3182
3183 skip_call |= validate_ranged_enum(
3184 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003185 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3186 ParameterName::IndexVector{i, attachmentIndex}),
3187 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003188 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3189
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003190 skip_call |=
3191 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3192 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3193 ParameterName::IndexVector{i, attachmentIndex}),
3194 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3195 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003196
3197 skip_call |=
3198 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003199 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3200 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003201 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3202 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3203 }
3204 }
3205
Dustin Gravesc900f572016-05-16 11:07:59 -06003206 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3207 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3208 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3209 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3210 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3211 i);
3212 }
3213
3214 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3215 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3216 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003217 report_data, "vkCreateGraphicsPipelines",
3218 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003219 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3220 }
3221 }
3222 }
3223 }
3224
3225 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003226 PreCreateGraphicsPipelines(device, pCreateInfos);
3227
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003228 result = get_dispatch_table(pc_device_table_map, device)
3229 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003230
Dustin Gravesc900f572016-05-16 11:07:59 -06003231 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003232 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003233
3234 return result;
3235}
3236
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003237bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003238 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3239
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003240 if (pCreateInfos != nullptr) {
3241 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003242 uint32_t i = 0;
3243 validate_string(data->report_data, "vkCreateComputePipelines",
3244 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003245 }
3246
3247 return true;
3248}
3249
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003250VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3251 const VkComputePipelineCreateInfo *pCreateInfos,
3252 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003253 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003254 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003255 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003256 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003257
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003258 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3259 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003260
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003261 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003262 PreCreateComputePipelines(device, pCreateInfos);
3263
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003264 result = get_dispatch_table(pc_device_table_map, device)
3265 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003266
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003267 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003268 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003269
3270 return result;
3271}
3272
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003273VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3274 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003275 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003276 assert(my_data != NULL);
3277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003278 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003279
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003280 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003281 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003282 }
3283}
3284
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003285VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3286 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003287 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003288 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003289 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003290 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003291
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003292 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003293
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003294 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003295 result =
3296 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003297
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003298 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003299 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003300
3301 return result;
3302}
3303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003304VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3305 const VkAllocationCallbacks *pAllocator) {
3306 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003308 assert(my_data != NULL);
3309
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003310 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003311
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003312 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003313 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003314 }
3315}
3316
Chia-I Wu01ca2372016-05-13 14:37:49 +08003317VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3318 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003319 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003320 bool skip_call = false;
3321 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3322 assert(device_data != NULL);
3323 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003324
Dustin Gravesc900f572016-05-16 11:07:59 -06003325 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003326
Dustin Gravesc900f572016-05-16 11:07:59 -06003327 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3328 if (pCreateInfo != nullptr) {
3329 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3330 if (pCreateInfo->compareEnable == VK_TRUE) {
3331 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3332 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3333 }
3334
3335 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3336 // valid VkBorderColor value
3337 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3338 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3339 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3340 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3341 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3342 }
3343 }
3344
3345 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003346 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3347
Dustin Gravesc900f572016-05-16 11:07:59 -06003348 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003349 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003350
3351 return result;
3352}
3353
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003354VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3355 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003356 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003357 assert(my_data != NULL);
3358
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003359 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003360
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003361 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003362 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003363 }
3364}
3365
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003366VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3367 const VkAllocationCallbacks *pAllocator,
3368 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003369 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003370 bool skip_call = false;
3371 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3372 assert(device_data != nullptr);
3373 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003374
Dustin Gravesc900f572016-05-16 11:07:59 -06003375 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003376
Dustin Gravesc900f572016-05-16 11:07:59 -06003377 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3378 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3379 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3380 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3381 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3382 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3383 // valid VkSampler handles
3384 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3385 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3386 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3387 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3388 ++descriptor_index) {
3389 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3390 skip_call |=
3391 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3392 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3393 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3394 " specified as VK_NULL_HANDLE",
3395 i, descriptor_index);
3396 }
3397 }
3398 }
3399
3400 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3401 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3402 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3403 skip_call |=
3404 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3405 UNRECOGNIZED_VALUE, LayerName,
3406 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3407 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3408 i, i);
3409 }
3410 }
3411 }
3412 }
3413
3414 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003415 result =
3416 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003417
Dustin Gravesc900f572016-05-16 11:07:59 -06003418 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003419 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003420
3421 return result;
3422}
3423
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003424VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3425 const VkAllocationCallbacks *pAllocator) {
3426 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003427 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003428 assert(my_data != NULL);
3429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003430 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003431
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003432 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003433 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003434 }
3435}
3436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003437VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3438 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003440 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003441 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003442 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003443
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003444 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003445
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003446 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003448 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003449 result =
3450 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003451
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003452 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003453 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003454
3455 return result;
3456}
3457
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003458VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3459 const VkAllocationCallbacks *pAllocator) {
3460 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003461 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003462 assert(my_data != NULL);
3463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003464 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003465
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003466 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003467 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003468 }
3469}
3470
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003471VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3472 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003473 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003474 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003475 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3476 assert(my_data != NULL);
3477
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003478 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003479
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003480 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003481 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3482
3483 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3484 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003485
3486 return result;
3487}
3488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003489VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3490 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003491 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003492 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003493 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003494 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003496 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003497
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003498 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003499 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3500
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003501 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003502 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003503
3504 return result;
3505}
3506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003507VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003508 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003509 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003510 bool skip_call = false;
3511 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3512 assert(device_data != nullptr);
3513 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003514
Dustin Gravesc900f572016-05-16 11:07:59 -06003515 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003516
Dustin Gravesc900f572016-05-16 11:07:59 -06003517 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3518 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3519 // validate_array()
3520 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3521 pDescriptorSets, true, true);
3522
3523 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003524 result = get_dispatch_table(pc_device_table_map, device)
3525 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003526
Dustin Gravesc900f572016-05-16 11:07:59 -06003527 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003528 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003529
3530 return result;
3531}
3532
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003533VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3534 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3535 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003536 bool skip_call = false;
3537 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3538 assert(device_data != NULL);
3539 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003540
Dustin Gravesc900f572016-05-16 11:07:59 -06003541 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3542 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003543
Dustin Gravesc900f572016-05-16 11:07:59 -06003544 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3545 if (pDescriptorWrites != NULL) {
3546 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3547 // descriptorCount must be greater than 0
3548 if (pDescriptorWrites[i].descriptorCount == 0) {
3549 skip_call |=
3550 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3551 REQUIRED_PARAMETER, LayerName,
3552 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3553 }
3554
3555 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3556 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3557 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3558 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3559 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3560 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3561 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3562 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3563 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3564 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3565 __LINE__, REQUIRED_PARAMETER, LayerName,
3566 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3567 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3568 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3569 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3570 i, i);
3571 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3572 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3573 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3574 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3575 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3576 ++descriptor_index) {
3577 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003578 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3579 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003580 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3581 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003582 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3583 ParameterName::IndexVector{i, descriptor_index}),
3584 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003585 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3586 }
3587 }
3588 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3589 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3590 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3591 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3592 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3593 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3594 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3595 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3596 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3597 __LINE__, REQUIRED_PARAMETER, LayerName,
3598 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3599 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3600 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3601 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3602 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003603 } else {
3604 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3605 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003606 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3607 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003608 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3609 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003610 }
3611 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3612 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3613 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3614 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3615 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3616 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3617 __LINE__, REQUIRED_PARAMETER, LayerName,
3618 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3619 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3620 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3621 i, i);
3622 } else {
3623 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3624 ++descriptor_index) {
3625 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003626 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3627 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003628 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3629 }
3630 }
3631 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003632
3633 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3634 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3635 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3636 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3637 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3638 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3639 skip_call |=
3640 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003641 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003642 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3643 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3644 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3645 }
3646 }
3647 }
3648 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3649 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3650 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3651 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3652 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3653 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3654 skip_call |=
3655 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003656 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003657 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3658 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3659 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3660 }
3661 }
3662 }
3663 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003664 }
3665 }
3666
3667 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003668 get_dispatch_table(pc_device_table_map, device)
3669 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003670 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003671}
3672
Chia-I Wu01ca2372016-05-13 14:37:49 +08003673VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003674 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003675 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003676 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003677 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003678 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003679
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003680 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003681
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003682 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003683 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3684
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003685 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003686 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003687
3688 return result;
3689}
3690
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003691VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3692 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003693 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003694 assert(my_data != NULL);
3695
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003696 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003698 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003699 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003700 }
3701}
3702
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003703bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3704 bool skip_call = false;
3705 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3706
3707 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3708 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3709 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 -06003710 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003711 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3712 }
3713 }
3714 return skip_call;
3715}
3716
Chia-I Wu01ca2372016-05-13 14:37:49 +08003717VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003718 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003719 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003720 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003721 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003722 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003724 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3725 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003726
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003727 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003728 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3729
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003730 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003731 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003732
3733 return result;
3734}
3735
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003736VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3737 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003738 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003739 assert(my_data != NULL);
3740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003741 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003742
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003743 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003744 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003745 }
3746}
3747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003748VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3749 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003750 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003751 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003753 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003754
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003755 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003756 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003757 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003758}
3759
Chia-I Wu01ca2372016-05-13 14:37:49 +08003760VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003761 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003762 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003763 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003764 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003765 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003767 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003768 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003770 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003771
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003772 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003773 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3774
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003775 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003776 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003777
3778 return result;
3779}
3780
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003781VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3782 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003783 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003784 assert(my_data != NULL);
3785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003786 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003787
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003788 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003789 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003790 }
3791}
3792
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003793VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003794 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003795 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003796 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3797 assert(my_data != NULL);
3798
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003799 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003800
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003801 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003802 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3803
3804 validate_result(my_data->report_data, "vkResetCommandPool", result);
3805 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003806
3807 return result;
3808}
3809
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003810VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3811 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003812 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003813 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003814 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003815 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003816
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003817 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003818
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003819 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003820 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3821
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003822 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003823 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003824
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003825 return result;
3826}
3827
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003828VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003829 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003830 bool skip_call = false;
3831 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3832 assert(device_data != nullptr);
3833 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003834
Dustin Gravesc900f572016-05-16 11:07:59 -06003835 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003836
Dustin Gravesc900f572016-05-16 11:07:59 -06003837 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3838 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3839 // validate_array()
3840 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3841 pCommandBuffers, true, true);
3842
3843 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003844 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003845 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003846 }
3847}
3848
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003849bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3850 bool skip_call = false;
3851 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3852 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3853
3854 if (pInfo != NULL) {
3855 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3856 skip_call |=
3857 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 -06003858 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003859 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3860 "inheritedQueries.");
3861 }
3862
3863 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3864 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3865 skip_call |=
3866 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 -06003867 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003868 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3869 "valid combination of VkQueryControlFlagBits.",
3870 pInfo->queryFlags);
3871 }
3872 }
3873 return skip_call;
3874}
3875
3876VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003877 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003878 bool skip_call = false;
3879 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3880 assert(device_data != nullptr);
3881 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003882
Dustin Gravesc900f572016-05-16 11:07:59 -06003883 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003884
Dustin Gravesc900f572016-05-16 11:07:59 -06003885 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3886 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3887 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3888 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3889 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3890
3891 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003892 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003893 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003894
3895 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3896 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3897
Dustin Gravesc900f572016-05-16 11:07:59 -06003898 // TODO: This only needs to be validated when the inherited queries feature is enabled
3899 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3900 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3901
3902 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3903 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3904 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3905 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3906 }
3907
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003908 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3909
Dustin Gravesc900f572016-05-16 11:07:59 -06003910 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003911 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3912
Dustin Gravesc900f572016-05-16 11:07:59 -06003913 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003914 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003915
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003916 return result;
3917}
3918
Chia-I Wu01ca2372016-05-13 14:37:49 +08003919VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003920 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3921 assert(my_data != NULL);
3922
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003923 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003924
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003925 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003926
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003927 return result;
3928}
3929
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003930VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003931 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003932 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3933 assert(my_data != NULL);
3934
Dustin Graves16d18972016-05-09 17:36:57 -06003935 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003936
Dustin Graves16d18972016-05-09 17:36:57 -06003937 if (!skip_call) {
3938 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3939
3940 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3941 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003942
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003943 return result;
3944}
3945
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003946VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3947 VkPipeline pipeline) {
3948 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003949 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3950 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003951
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003952 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003953
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003954 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003955 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3956 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003957}
3958
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003959bool preCmdSetViewport(debug_report_data *report_data, uint32_t viewport_count, const VkViewport *viewports) {
3960 bool skip =
3961 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
3962 return skip;
3963}
3964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003965VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3966 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003967 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003969 assert(my_data != NULL);
3970
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003971 skip |= preCmdSetViewport(my_data->report_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003972
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003973 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003974 get_dispatch_table(pc_device_table_map, commandBuffer)
3975 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003976 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003977}
3978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003979VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3980 const VkRect2D *pScissors) {
3981 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003982 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003983 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06003984 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07003985
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003986 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003987
Mike Weiblena4742dc2016-10-31 11:05:56 -06003988 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
3989 const VkRect2D &pScissor = pScissors[scissorIndex];
3990
3991 if (pScissor.offset.x < 0) {
3992 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3993 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
3994 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
3995 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
3996 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3997 VALIDATION_ERROR_01490, LayerName,
3998 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
3999 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4000 }
4001
4002 if (pScissor.offset.y < 0) {
4003 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4004 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4005 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4006 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
4007 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4008 VALIDATION_ERROR_01491, LayerName,
4009 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4010 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4011 }
4012 }
4013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004014 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004015 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4016 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004017}
4018
Chia-I Wu01ca2372016-05-13 14:37:49 +08004019VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004020 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004021}
4022
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004023VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4024 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004025 get_dispatch_table(pc_device_table_map, commandBuffer)
4026 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004027}
4028
Chia-I Wu01ca2372016-05-13 14:37:49 +08004029VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004030 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004031 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004032 assert(my_data != NULL);
4033
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004034 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004035
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004036 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004037 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4038 }
Cody Northrop12365112015-08-17 11:10:49 -06004039}
4040
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004041VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004042 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004043}
4044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004045VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4046 uint32_t compareMask) {
4047 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004048 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4049 assert(my_data != NULL);
4050
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004051 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004052
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004053 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004054 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4055 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004056}
4057
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004058VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4059 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004060 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4061 assert(my_data != NULL);
4062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004063 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004065 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004066 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4067 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004068}
4069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004070VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4071 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4073 assert(my_data != NULL);
4074
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004075 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004076
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004077 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004078 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4079 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004080}
4081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004082VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4083 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4084 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4085 const uint32_t *pDynamicOffsets) {
4086 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004087 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004088 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004089
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004090 skip_call |=
4091 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4092 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004093
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004094 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004095 get_dispatch_table(pc_device_table_map, commandBuffer)
4096 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4097 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004098 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004099}
4100
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004101VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4102 VkIndexType indexType) {
4103 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004104 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4105 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004107 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004108
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004109 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004110 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4111 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004112}
4113
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004114VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4115 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4116 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004117 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004118 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004119
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004120 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004121
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004122 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004123 get_dispatch_table(pc_device_table_map, commandBuffer)
4124 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004125 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004126}
4127
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004128bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4129 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004130 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004131 // 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 -07004132 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004133 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 -06004134 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004135 return false;
4136 }
4137
4138 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004139 // 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 -07004140 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004141 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 -06004142 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004143 return false;
4144 }
4145
4146 return true;
4147}
4148
Chia-I Wu01ca2372016-05-13 14:37:49 +08004149VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4150 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004151 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004152
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004153 get_dispatch_table(pc_device_table_map, commandBuffer)
4154 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004155}
4156
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004157VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4158 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004159 get_dispatch_table(pc_device_table_map, commandBuffer)
4160 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004161}
4162
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004163VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4164 uint32_t stride) {
4165 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4167 assert(my_data != NULL);
4168
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004169 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004170
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004171 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004172 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4173 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004174}
4175
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004176VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4177 uint32_t count, uint32_t stride) {
4178 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004179 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4180 assert(my_data != NULL);
4181
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004182 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004183
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004184 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004185 get_dispatch_table(pc_device_table_map, commandBuffer)
4186 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4187 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004188}
4189
Chia-I Wu01ca2372016-05-13 14:37:49 +08004190VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004191 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004192}
4193
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004194VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4195 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004196 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4197 assert(my_data != NULL);
4198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004199 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004201 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004202 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4203 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004204}
4205
Chia-I Wu01ca2372016-05-13 14:37:49 +08004206VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4207 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004208 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004209 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004210 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004211
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004212 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004213
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004214 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004215 get_dispatch_table(pc_device_table_map, commandBuffer)
4216 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004217 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004218}
4219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004220bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4221 if (pRegions != nullptr) {
4222 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4223 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004224 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 -06004225 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004226 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4227 return false;
4228 }
4229 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4230 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004231 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 -06004232 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004233 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4234 return false;
4235 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004236 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004237
4238 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004239}
4240
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004241VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4242 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4243 const VkImageCopy *pRegions) {
4244 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004245 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004246 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004247
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004248 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4249 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004250
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004251 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004252 PreCmdCopyImage(commandBuffer, pRegions);
4253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004254 get_dispatch_table(pc_device_table_map, commandBuffer)
4255 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004256 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004257}
4258
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004259bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4260 if (pRegions != nullptr) {
4261 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4262 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004263 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 -06004264 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004265 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4266 return false;
4267 }
4268 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4269 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004270 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 -06004271 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004272 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4273 return false;
4274 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004275 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004276
4277 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004278}
4279
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004280VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4281 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4282 const VkImageBlit *pRegions, VkFilter filter) {
4283 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004284 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004285 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004286
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004287 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4288 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004290 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004291 PreCmdBlitImage(commandBuffer, pRegions);
4292
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004293 get_dispatch_table(pc_device_table_map, commandBuffer)
4294 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004295 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004296}
4297
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004298bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4299 if (pRegions != nullptr) {
4300 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4301 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004302 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 -06004303 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004304 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4305 "enumerator");
4306 return false;
4307 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004308 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004309
4310 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004311}
4312
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004313VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4314 VkImageLayout dstImageLayout, uint32_t regionCount,
4315 const VkBufferImageCopy *pRegions) {
4316 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004317 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004318 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004319
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004320 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4321 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004322
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004323 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004324 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4325
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004326 get_dispatch_table(pc_device_table_map, commandBuffer)
4327 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004328 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004329}
4330
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004331bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4332 if (pRegions != nullptr) {
4333 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4334 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004335 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 -06004336 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004337 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4338 "enumerator");
4339 return false;
4340 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004341 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004342
4343 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004344}
4345
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004346VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4347 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4348 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004349 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004350 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004351
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004352 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4353 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004354
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004355 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004356 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4357
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004358 get_dispatch_table(pc_device_table_map, commandBuffer)
4359 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004360 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004361}
4362
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004363VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4364 VkDeviceSize dataSize, const uint32_t *pData) {
4365 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004366 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004367 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004368
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004369 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004370
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004371 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004372 skip_call |= log_msg(
4373 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4374 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004375 }
4376
4377 if ((dataSize <= 0) || (dataSize > 65536)) {
4378 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 -06004379 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4380 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004381 dataSize);
4382 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004383 skip_call |= log_msg(
4384 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4385 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004386 }
4387
4388 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004389 get_dispatch_table(pc_device_table_map, commandBuffer)
4390 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004391 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004392}
4393
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004394VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4395 VkDeviceSize size, uint32_t data) {
4396 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004397 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4398 assert(my_data != NULL);
4399
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004400 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004401
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004402 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004403 skip_call |= log_msg(
4404 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4405 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004406 }
4407
4408 if (size != VK_WHOLE_SIZE) {
4409 if (size <= 0) {
4410 skip_call |= log_msg(
4411 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004412 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004413 } else if (size & 3) {
4414 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 -06004415 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004416 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4417 }
4418 }
4419
4420 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004421 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4422 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004423}
4424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004425VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4426 const VkClearColorValue *pColor, uint32_t rangeCount,
4427 const VkImageSubresourceRange *pRanges) {
4428 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004429 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004430 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004431
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004432 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, 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 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004437 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004438}
4439
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004440VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4441 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4442 const VkImageSubresourceRange *pRanges) {
4443 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_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4448 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004450 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004451 get_dispatch_table(pc_device_table_map, commandBuffer)
4452 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004453 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004454}
4455
Chia-I Wu01ca2372016-05-13 14:37:49 +08004456VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4457 const VkClearAttachment *pAttachments, uint32_t rectCount,
4458 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004459 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004460 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004461 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004462
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004463 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004465 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004466 get_dispatch_table(pc_device_table_map, commandBuffer)
4467 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004468 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004469}
4470
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004471bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4472 if (pRegions != nullptr) {
4473 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4474 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4475 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004476 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004477 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004478 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4479 return false;
4480 }
4481 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4482 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4483 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004484 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004485 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004486 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4487 return false;
4488 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004489 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004490
4491 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004492}
4493
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004494VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4495 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4496 const VkImageResolve *pRegions) {
4497 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004498 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004499 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4502 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004503
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004504 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004505 PreCmdResolveImage(commandBuffer, pRegions);
4506
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004507 get_dispatch_table(pc_device_table_map, commandBuffer)
4508 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004509 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004510}
4511
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004512VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4513 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004514 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4515 assert(my_data != NULL);
4516
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004517 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004518
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004519 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004520 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4521 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004522}
4523
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004524VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4525 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004526 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4527 assert(my_data != NULL);
4528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004529 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004530
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004531 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004532 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4533 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004534}
4535
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004536VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4537 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4538 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4539 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4540 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4541 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004542 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004543 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004545 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4546 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4547 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004548
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004549 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004550 get_dispatch_table(pc_device_table_map, commandBuffer)
4551 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4552 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004553 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004554}
4555
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004556VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4557 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4558 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4559 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4560 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4561 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004562 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004563 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004565 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4566 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4567 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004568
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004569 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004570 get_dispatch_table(pc_device_table_map, commandBuffer)
4571 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4572 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004573 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004574}
4575
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004576VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4577 VkQueryControlFlags flags) {
4578 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004579 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4580 assert(my_data != NULL);
4581
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004582 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004583
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004584 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004585 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4586 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004587}
4588
Chia-I Wu01ca2372016-05-13 14:37:49 +08004589VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004590 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004591 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4592 assert(my_data != NULL);
4593
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004594 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004595
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004596 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004597 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004599}
4600
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004601VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4602 uint32_t queryCount) {
4603 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004604 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4605 assert(my_data != NULL);
4606
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004607 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004609 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004610 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4611 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004612}
4613
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004614bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4615 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004616
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004617 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004618
4619 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004620}
4621
Chia-I Wu01ca2372016-05-13 14:37:49 +08004622VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4623 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004624 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);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004627
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004628 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004629
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004630 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004631 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4632
4633 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4634 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004635}
4636
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004637VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4638 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4639 VkDeviceSize stride, VkQueryResultFlags flags) {
4640 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004641 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4642 assert(my_data != NULL);
4643
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004644 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4645 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004646
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004647 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004648 get_dispatch_table(pc_device_table_map, commandBuffer)
4649 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4650 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004651}
4652
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004653VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4654 uint32_t offset, uint32_t size, const void *pValues) {
4655 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004656 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004657 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004658
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004659 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004661 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004662 get_dispatch_table(pc_device_table_map, commandBuffer)
4663 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004664 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004665}
4666
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004667VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4668 VkSubpassContents contents) {
4669 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004671 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004673 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004674
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004675 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004676 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004677 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004678}
4679
Chia-I Wu01ca2372016-05-13 14:37:49 +08004680VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004681 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4683 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004685 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004686
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004687 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004688 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4689 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004690}
4691
Chia-I Wu01ca2372016-05-13 14:37:49 +08004692VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004693 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004694}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004695
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004696VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4697 const VkCommandBuffer *pCommandBuffers) {
4698 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004699 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004700 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004702 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004703
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004704 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004705 get_dispatch_table(pc_device_table_map, commandBuffer)
4706 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004707 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004708}
4709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004710VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004711 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4712}
4713
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004714VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4715 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004716 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4717}
4718
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004719VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4720 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004721 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4722 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4723
4724 return VK_ERROR_LAYER_NOT_PRESENT;
4725}
4726
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004727VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4728 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004729 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004730 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004731 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004732
4733 assert(physicalDevice);
4734
4735 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4736 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004737}
4738
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004739// WSI Extension Functions
4740
4741VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004742 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004743 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004744 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004745 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4746 assert(my_data != NULL);
4747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004748 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004750 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004751 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4752
4753 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4754 }
4755
4756 return result;
4757}
4758
4759VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004760 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004761 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004762 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004763 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4764 assert(my_data != NULL);
4765
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004766 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004767 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4768
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004769 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004770 result = get_dispatch_table(pc_device_table_map, device)
4771 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4772
4773 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4774 }
4775
4776 return result;
4777}
4778
4779VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004780 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004781 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004782 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004783 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4784 assert(my_data != NULL);
4785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004786 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004787 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004789 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004790 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004791 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004792
4793 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4794 }
4795
4796 return result;
4797}
4798
4799VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4800 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004801 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004802 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4803 assert(my_data != NULL);
4804
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004805 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004806
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004807 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004808 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4809
4810 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4811 }
4812
4813 return result;
4814}
4815
4816VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4817 VkSurfaceKHR surface, VkBool32 *pSupported) {
4818 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004819 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004820 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4821 assert(my_data != NULL);
4822
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004823 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004824 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4825
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004826 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004827 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4828 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4829
4830 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4831 }
4832
4833 return result;
4834}
4835
4836VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4837 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4838 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004839 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004840 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4841 assert(my_data != NULL);
4842
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004843 skip_call |=
4844 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004845
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004846 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004847 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4848 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4849
4850 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4851 }
4852
4853 return result;
4854}
4855
4856VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4857 uint32_t *pSurfaceFormatCount,
4858 VkSurfaceFormatKHR *pSurfaceFormats) {
4859 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004860 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004861 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4862 assert(my_data != NULL);
4863
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004864 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4865 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004867 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004868 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4869 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4870
4871 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4872 }
4873
4874 return result;
4875}
4876
4877VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4878 uint32_t *pPresentModeCount,
4879 VkPresentModeKHR *pPresentModes) {
4880 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004881 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004882 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4883 assert(my_data != NULL);
4884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004885 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4886 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004887
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004888 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004889 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4890 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4891
4892 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4893 }
4894
4895 return result;
4896}
4897
4898#ifdef VK_USE_PLATFORM_WIN32_KHR
4899VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4900 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4901 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4902
4903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4904 assert(my_data != NULL);
4905
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004906 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004907
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004908 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004909 result =
4910 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4911 }
4912
4913 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4914
4915 return result;
4916}
4917#endif // VK_USE_PLATFORM_WIN32_KHR
4918
4919#ifdef VK_USE_PLATFORM_XCB_KHR
4920VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4921 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4922 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4923
4924 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4925 assert(my_data != NULL);
4926
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004927 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004928
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004929 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004930 result =
4931 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4932 }
4933
4934 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4935
4936 return result;
4937}
4938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004939VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4940 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4941 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 VkBool32 result = false;
4943
4944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4945 assert(my_data != NULL);
4946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004947 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4948 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004950 if (!skip_call) {
4951 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4952 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953 }
4954
4955 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004956}
4957#endif // VK_USE_PLATFORM_XCB_KHR
4958
4959#ifdef VK_USE_PLATFORM_XLIB_KHR
4960VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004961 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004962 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4963
4964 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4965 assert(my_data != NULL);
4966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004967 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004968
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004969 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004970 result =
4971 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4972 }
4973
4974 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4975
4976 return result;
4977}
4978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004979VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4980 uint32_t queueFamilyIndex, Display *dpy,
4981 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004982 VkBool32 result = false;
4983
4984 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4985 assert(my_data != NULL);
4986
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004987 bool skip_call =
4988 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004990 if (!skip_call) {
4991 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4992 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004993 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06004994 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004995}
4996#endif // VK_USE_PLATFORM_XLIB_KHR
4997
4998#ifdef VK_USE_PLATFORM_MIR_KHR
4999VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005000 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005001 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5002
5003 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5004 assert(my_data != NULL);
5005
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005006 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005007
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005008 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005009 result =
5010 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5011 }
5012
5013 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5014
5015 return result;
5016}
5017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005018VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5019 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005020 VkBool32 result = false;
5021
5022 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5023 assert(my_data != NULL);
5024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005025 bool skip_call =
5026 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005027
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005028 if (!skip_call) {
5029 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5030 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005031 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005032}
5033#endif // VK_USE_PLATFORM_MIR_KHR
5034
5035#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5036VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005037 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005038 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5039
5040 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5041 assert(my_data != NULL);
5042
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005043 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005045 if (!skip_call) {
5046 result = get_dispatch_table(pc_instance_table_map, instance)
5047 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048 }
5049
5050 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5051
5052 return result;
5053}
5054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005055VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5056 uint32_t queueFamilyIndex,
5057 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005058 VkBool32 result = false;
5059
5060 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5061 assert(my_data != NULL);
5062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005063 bool skip_call =
5064 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005065
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005066 if (!skip_call) {
5067 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5068 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005069 }
5070}
5071#endif // VK_USE_PLATFORM_WAYLAND_KHR
5072
5073#ifdef VK_USE_PLATFORM_ANDROID_KHR
5074VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005075 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005076 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5077
5078 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5079 assert(my_data != NULL);
5080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005081 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005082
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005083 if (!skip_call) {
5084 result = get_dispatch_table(pc_instance_table_map, instance)
5085 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005086 }
5087
5088 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5089
5090 return result;
5091}
5092#endif // VK_USE_PLATFORM_ANDROID_KHR
5093
Mark Youngead9b932016-09-08 12:28:38 -06005094VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5095 const VkSwapchainCreateInfoKHR *pCreateInfos,
5096 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5097 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5098 bool skip_call = false;
5099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5100 assert(my_data != NULL);
5101
5102 skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
5103 pSwapchains);
5104
5105 if (!skip_call) {
5106 result = get_dispatch_table(pc_device_table_map, device)
5107 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5108
5109 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5110 }
5111
5112 return result;
5113}
5114
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005115// VK_EXT_debug_marker Extension
5116VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5117 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5118 bool skip_call = false;
5119 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5120 assert(my_data != NULL);
5121
5122 skip_call |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
5123
5124 if (!skip_call) {
5125 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5126
5127 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5128 }
5129
5130 return result;
5131}
5132
5133VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5134 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5135 bool skip_call = false;
5136 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5137 assert(my_data != NULL);
5138
5139 skip_call |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
5140
5141 if (!skip_call) {
5142 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5143
5144 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5145 }
5146
5147 return result;
5148}
5149
5150VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5151 bool skip_call = false;
5152 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5153 assert(my_data != NULL);
5154
5155 skip_call |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
5156
5157 if (!skip_call) {
5158 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5159 }
5160}
5161
5162VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5163 bool skip_call = false;
5164 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5165 assert(my_data != NULL);
5166
5167 skip_call |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
5168
5169 if (!skip_call) {
5170 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5171 }
5172}
5173
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005174// VK_NV_external_memory_capabilities Extension
5175VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5176 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5177 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5178 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5179
5180 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5181 bool skip_call = false;
5182 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5183 assert(my_data != NULL);
5184
5185 skip_call |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
5186 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5187
5188 if (!skip_call) {
5189 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5190 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5191 externalHandleType, pExternalImageFormatProperties);
5192
5193 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5194 }
5195
5196 return result;
5197}
5198
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005199#ifdef VK_USE_PLATFORM_WIN32_KHR
5200// VK_NV_external_memory_win32 Extension
5201VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5202 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5203
5204 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5205 bool skip_call = false;
5206 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5207 assert(my_data != NULL);
5208
5209 skip_call |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
5210
5211 if (!skip_call) {
5212 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5213 }
5214
5215 return result;
5216}
5217#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005218
5219
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005220
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005221static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005222
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005223static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005224
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005225static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005226
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005227static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005228
Chia-I Wu01ca2372016-05-13 14:37:49 +08005229VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005230 assert(device);
5231
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005232 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5233
Dustin Graves080069b2016-04-05 13:48:15 -06005234 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005235 return NULL;
5236 }
5237
Chia-I Wuf9b01382016-05-16 07:37:41 +08005238 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5239 if (proc)
5240 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005241
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005242 proc = InterceptWsiEnabledCommand(funcName, device);
5243 if (proc)
5244 return proc;
5245
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005246 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005247 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005248 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005249}
5250
Chia-I Wu01ca2372016-05-13 14:37:49 +08005251VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005252 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005253 if (!proc)
5254 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005255
5256 if (!proc)
5257 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005258
Chia-I Wu617f2a42016-05-16 07:41:17 +08005259 if (proc)
5260 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005261
Chia-I Wu617f2a42016-05-16 07:41:17 +08005262 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005263
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005264 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005265
Chia-I Wu617f2a42016-05-16 07:41:17 +08005266 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005267 if (!proc)
5268 proc = InterceptWsiEnabledCommand(funcName, instance);
5269
Chia-I Wu617f2a42016-05-16 07:41:17 +08005270 if (proc)
5271 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005272
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005273 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005274 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005275 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005276}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005278static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005279 static const struct {
5280 const char *name;
5281 PFN_vkVoidFunction proc;
5282 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005283 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5284 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5285 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5286 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5287 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5288 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5289 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5290 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5291 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5292 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5293 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5294 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5295 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5296 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5297 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5298 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5299 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005300 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005301 };
5302
5303 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5304 if (!strcmp(core_instance_commands[i].name, name))
5305 return core_instance_commands[i].proc;
5306 }
5307
5308 return nullptr;
5309}
5310
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005311static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005312 static const struct {
5313 const char *name;
5314 PFN_vkVoidFunction proc;
5315 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005316 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5317 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5318 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5319 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5320 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5321 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5322 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5323 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5324 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5325 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5326 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5327 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5328 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5329 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5330 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5331 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5332 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5333 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5334 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5335 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5336 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5337 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5338 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5339 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5340 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5341 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5342 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5343 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5344 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5345 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5346 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5347 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5348 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5349 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5350 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5351 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5352 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5353 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5354 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5355 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5356 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5357 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5358 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5359 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5360 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5361 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5362 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5363 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5364 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5365 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5366 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5367 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5368 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5369 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5370 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5371 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5372 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5373 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5374 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5375 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5376 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5377 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5378 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5379 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5380 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5381 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5382 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5383 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5384 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5385 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5386 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5387 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5388 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5389 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5390 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5391 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5392 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5393 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5394 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5395 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5396 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5397 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5398 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5399 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5400 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5401 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5402 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5403 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5404 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5405 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5406 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5407 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5408 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5409 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5410 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5411 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5412 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5413 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5414 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5415 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5416 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5417 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5418 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5419 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5420 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5421 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5422 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5423 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5424 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5425 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5426 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5427 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5428 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5429 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5430 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5431 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5432 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005433 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5434 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5435 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5436 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005437#ifdef VK_USE_PLATFORM_WIN32_KHR
5438 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5439#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005440};
5441
Chia-I Wuf9b01382016-05-16 07:37:41 +08005442
5443 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5444 if (!strcmp(core_device_commands[i].name, name))
5445 return core_device_commands[i].proc;
5446 }
5447
5448 return nullptr;
5449}
5450
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005451static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005452 static const struct {
5453 const char *name;
5454 PFN_vkVoidFunction proc;
5455 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005456 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5457 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5458 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5459 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005460 };
5461
5462 if (device) {
5463 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005464
Mark Youngead9b932016-09-08 12:28:38 -06005465 if (device_data->wsi_enabled) {
5466 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5467 if (!strcmp(wsi_device_commands[i].name, name))
5468 return wsi_device_commands[i].proc;
5469 }
5470 }
5471
5472 if (device_data->wsi_display_swapchain_enabled) {
5473 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5474 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
5475 }
5476 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005477 }
5478
5479 return nullptr;
5480}
5481
5482static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5483 static const struct {
5484 const char *name;
5485 PFN_vkVoidFunction proc;
5486 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005487 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5488 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5489 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5490 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5491 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5492 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005493 };
5494
5495 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005496 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005497 return nullptr;
5498
5499 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5500 if (!strcmp(wsi_instance_commands[i].name, name))
5501 return wsi_instance_commands[i].proc;
5502 }
5503
5504#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005505 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005506 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5507#endif // VK_USE_PLATFORM_WIN32_KHR
5508#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005509 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005510 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005511 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005512 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5513#endif // VK_USE_PLATFORM_XCB_KHR
5514#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005515 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005516 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005517 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005518 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5519#endif // VK_USE_PLATFORM_XLIB_KHR
5520#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005521 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005522 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005523 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005524 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5525#endif // VK_USE_PLATFORM_MIR_KHR
5526#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005527 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005528 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005529 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5530 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005531 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5532#endif // VK_USE_PLATFORM_WAYLAND_KHR
5533#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005534 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005535 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5536#endif // VK_USE_PLATFORM_ANDROID_KHR
5537
5538 return nullptr;
5539}
5540
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005541} // namespace parameter_validation
5542
5543// vk_layer_logging.h expects these to be defined
5544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005545VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5546 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5547 const VkAllocationCallbacks *pAllocator,
5548 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005549 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005550}
5551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005552VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5553 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005554 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005555}
5556
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005557VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5558 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5559 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005560 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005561}
5562
5563// loader-layer interface v0
5564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005565VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5566 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005567 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005568}
5569
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005570VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5571 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005572 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005573}
5574
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005575VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5576 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005577 // the layer command handles VK_NULL_HANDLE just fine internally
5578 assert(physicalDevice == VK_NULL_HANDLE);
5579 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005580}
5581
5582VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5583 const char *pLayerName, uint32_t *pCount,
5584 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005585 // the layer command handles VK_NULL_HANDLE just fine internally
5586 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005587 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005588}
5589
5590VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005591 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005592}
5593
5594VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005595 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005596}