blob: 0cc31a11b0693ba1e4c5aa8638eb4ed60e92de42 [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 instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070090debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060091 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060092 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060093#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060094 fprintf(stderr, "MID: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060095#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060096 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060097
98 return data->report_data;
99}
100
101// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700102debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600103 dispatch_key key = get_dispatch_key(object);
104 layer_data *data = get_my_data_ptr(key, layer_data_map);
105#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -0600106 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 -0600107#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -0600108 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600109 return data->report_data;
110}
111
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600112static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600113
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600114 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600115}
116
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600117VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
118 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
119 const VkAllocationCallbacks *pAllocator,
120 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700121 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700122 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600123
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700124 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700125 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600126 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600127 }
128
129 return result;
130}
131
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600132VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800133 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700134 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700135 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600136
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700137 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700138 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600139}
140
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600141VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
142 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
143 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700144 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
145 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700146}
147
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700148static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600149
Chia-I Wu3384db82016-05-16 07:30:58 +0800150static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600151 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800152};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700153
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700154static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600155 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700156 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
157 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
158 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
159 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
160 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 -0700161 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700162 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600163 return false;
164 }
165
166 return true;
167}
168
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
170 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600171 return "unrecognized enumerator";
172 }
173
174 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600185 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
192 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
195 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600197 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
198 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600200 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
201 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700202 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600203 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
204 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700205 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800206 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600207 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700208 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800209 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600210 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700211 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700212 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
213 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600214
215 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600217 enumeratorString += string;
218
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700219 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600220 enumeratorString += '|';
221 }
222 }
223
224 return enumeratorString;
225}
226
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700227static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
228 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
229 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
230 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
231 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
232 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600233 return false;
234 }
235
236 return true;
237}
238
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
240 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 return "unrecognized enumerator";
242 }
243
244 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
247 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600249 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600250 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
253 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600255 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
256 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700257 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600258 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
259 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700260 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800261 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600262 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700263 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600264 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
265 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700266 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800267 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600268 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600269
270 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600272 enumeratorString += string;
273
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700274 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600275 enumeratorString += '|';
276 }
277 }
278
279 return enumeratorString;
280}
281
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700282static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
283 VkQueueFlagBits allFlags =
284 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
285 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600286 return false;
287 }
288
289 return true;
290}
291
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
293 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600294 return "unrecognized enumerator";
295 }
296
297 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700298 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800299 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600300 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700301 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600302 strings.push_back("VK_QUEUE_COMPUTE_BIT");
303 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700304 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800305 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600306 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700307 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600308 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
309 }
310
311 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600313 enumeratorString += string;
314
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700315 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600316 enumeratorString += '|';
317 }
318 }
319
320 return enumeratorString;
321}
322
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
324 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
325 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
326 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
327 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600328 return false;
329 }
330
331 return true;
332}
333
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
335 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600336 return "unrecognized enumerator";
337 }
338
339 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600341 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
342 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700343 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800344 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700346 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600347 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
348 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700349 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800350 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600351 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700352 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800353 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600354 }
355
356 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 enumeratorString += string;
359
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700360 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600361 enumeratorString += '|';
362 }
363 }
364
365 return enumeratorString;
366}
367
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700369 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700370 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600371 return false;
372 }
373
374 return true;
375}
376
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700377static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
378 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600379 return "unrecognized enumerator";
380 }
381
382 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700383 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800384 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600385 }
386
387 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700388 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600389 enumeratorString += string;
390
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700391 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600392 enumeratorString += '|';
393 }
394 }
395
396 return enumeratorString;
397}
398
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700399static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
400 VkSparseImageFormatFlagBits allFlags =
401 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
402 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
403 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600404 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600405 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600406
407 return true;
408}
409
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700410static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
411 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600412 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600413 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600414
415 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700416 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800417 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600418 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700419 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800420 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600421 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700422 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800423 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600424 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600425
426 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 enumeratorString += string;
429
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700430 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600431 enumeratorString += '|';
432 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600433 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600434
435 return enumeratorString;
436}
437
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700439 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700440 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600441 return false;
442 }
443
444 return true;
445}
446
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700447static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
448 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600449 return "unrecognized enumerator";
450 }
451
452 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700453 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600454 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
455 }
456
457 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600459 enumeratorString += string;
460
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700461 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600462 enumeratorString += '|';
463 }
464 }
465
466 return enumeratorString;
467}
468
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700469static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
470 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
471 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
472 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
473 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
474 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600475 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
476 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
477 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700478 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600479 return false;
480 }
481
482 return true;
483}
484
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700485static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
486 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487 return "unrecognized enumerator";
488 }
489
490 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_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_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600502 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700504 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_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_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700507 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600508 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700510 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600511 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700512 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700513 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700515 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700516 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600517 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700518 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700519 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600520 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700521 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700522 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600523 }
524
525 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600527 enumeratorString += string;
528
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700529 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600530 enumeratorString += '|';
531 }
532 }
533
534 return enumeratorString;
535}
536
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700537static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
538 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
539 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
540 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600541 return false;
542 }
543
544 return true;
545}
546
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700547static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
548 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600549 return "unrecognized enumerator";
550 }
551
552 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700553 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600554 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
555 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700556 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600557 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
558 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700559 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600560 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
561 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700562 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600563 strings.push_back("VK_QUERY_RESULT_64_BIT");
564 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600565
566 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700567 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600568 enumeratorString += string;
569
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700570 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600571 enumeratorString += '|';
572 }
573 }
574
575 return enumeratorString;
576}
577
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
579 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
580 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
581 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
582 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
583 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600584 return false;
585 }
586
587 return true;
588}
589
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
591 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600592 return "unrecognized enumerator";
593 }
594
595 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
601 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
604 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
607 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700608 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600609 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
610 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700611 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800612 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700614 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600615 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
616 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700617 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800618 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600619 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700620 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600621 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
622 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600623
624 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600626 enumeratorString += string;
627
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700628 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600629 enumeratorString += '|';
630 }
631 }
632
633 return enumeratorString;
634}
635
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700636static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
637 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
638 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
639 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600640 return false;
641 }
642
643 return true;
644}
645
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700646static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
647 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600648 return "unrecognized enumerator";
649 }
650
651 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700652 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600653 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
654 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700655 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600656 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
657 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700658 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600659 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600660 }
661
662 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700663 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600664 enumeratorString += string;
665
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700666 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600667 enumeratorString += '|';
668 }
669 }
670
671 return enumeratorString;
672}
673
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
675 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
676 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
677 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
678 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600679 return false;
680 }
681
682 return true;
683}
684
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
686 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600687 return "unrecognized enumerator";
688 }
689
690 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700691 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600692 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
693 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700694 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600695 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
696 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700697 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600698 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
699 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700700 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600701 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
702 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700703 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600704 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600705 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600706
707 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600709 enumeratorString += string;
710
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700711 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600712 enumeratorString += '|';
713 }
714 }
715
716 return enumeratorString;
717}
718
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700719static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
720 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
721 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
722 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600723 return false;
724 }
725
726 return true;
727}
728
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700729static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
730 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600731 return "unrecognized enumerator";
732 }
733
734 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700735 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800736 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600737 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700738 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800739 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600740 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700741 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800742 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600743 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700744 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800745 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600746 }
747
748 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600750 enumeratorString += string;
751
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700752 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600753 enumeratorString += '|';
754 }
755 }
756
757 return enumeratorString;
758}
759
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700760static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
761 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
762 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
763 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600764 return false;
765 }
766
767 return true;
768}
769
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700770static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
771 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600772 return "unrecognized enumerator";
773 }
774
775 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600777 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
778 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700779 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600780 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
781 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700782 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600783 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600784 }
785
786 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700787 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600788 enumeratorString += string;
789
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700790 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600791 enumeratorString += '|';
792 }
793 }
794
795 return enumeratorString;
796}
797
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
799 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
800 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
801 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
802 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600803 return false;
804 }
805
806 return true;
807}
808
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700809static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
810 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600811 return "unrecognized enumerator";
812 }
813
814 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600816 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600817 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600819 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600820 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600822 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
823 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700824 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600825 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
826 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700827 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600828 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600829 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700830 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600831 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600832 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700833 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600834 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600835 }
836
837 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600839 enumeratorString += string;
840
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700841 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600842 enumeratorString += '|';
843 }
844 }
845
846 return enumeratorString;
847}
848
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700849static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800850 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
852 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
853 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
854 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
855 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
856 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 -0700857 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700858 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600859 return false;
860 }
861
862 return true;
863}
864
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
866 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600867 return "unrecognized enumerator";
868 }
869
870 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800872 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800875 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600881 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600884 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700887 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600896 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600899 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600900 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600902 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
903 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600905 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
906 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700907 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700908 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600909 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700910 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600911 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
912 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700913 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600914 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
915 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700916 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600917 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
918 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700919 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600920 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600921 }
922
923 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600925 enumeratorString += string;
926
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700927 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600928 enumeratorString += '|';
929 }
930 }
931
932 return enumeratorString;
933}
934
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800936 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700937 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
938 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
939 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
940 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
941 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 +0800942
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700943 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600944 return false;
945 }
946
947 return true;
948}
949
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
951 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600952 return "unrecognized enumerator";
953 }
954
955 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600985 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800987 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600988 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800990 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600991 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700992 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800993 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600994 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700995 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800996 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600997 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700998 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800999 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001000 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001001 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001002 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001003 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001004 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001005 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001006 }
1007
1008 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001010 enumeratorString += string;
1011
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001012 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001013 enumeratorString += '|';
1014 }
1015 }
1016
1017 return enumeratorString;
1018}
1019
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001020static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1021 VkCommandPoolCreateFlagBits allFlags =
1022 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1023 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001024 return false;
1025 }
1026
1027 return true;
1028}
1029
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001030static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1031 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001032 return "unrecognized enumerator";
1033 }
1034
1035 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001036 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001037 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001038 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001039 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001040 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001041 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001042
1043 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045 enumeratorString += string;
1046
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001047 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001048 enumeratorString += '|';
1049 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001050 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001051
1052 return enumeratorString;
1053}
1054
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001056 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001057 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001058 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001059 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001060
1061 return true;
1062}
1063
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001064static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1065 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001066 return "unrecognized enumerator";
1067 }
1068
1069 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001070 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001071 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001072 }
1073
1074 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001075 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001076 enumeratorString += string;
1077
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001078 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001079 enumeratorString += '|';
1080 }
1081 }
1082
1083 return enumeratorString;
1084}
1085
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001086static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1087 VkCommandBufferUsageFlags allFlags =
1088 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1089 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1090 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001091 return false;
1092 }
1093
1094 return true;
1095}
1096
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001097static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1098 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001099 return "unrecognized enumerator";
1100 }
1101
1102 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001103 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001104 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001105 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001106 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001107 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001108 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001109 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001110 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001111 }
1112
1113 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 enumeratorString += string;
1116
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001117 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001118 enumeratorString += '|';
1119 }
1120 }
1121
1122 return enumeratorString;
1123}
1124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001126 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001127 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001128 return false;
1129 }
1130
1131 return true;
1132}
1133
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001134static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1135 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001136 return "unrecognized enumerator";
1137 }
1138
1139 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001140 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001141 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001142 }
1143
1144 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001146 enumeratorString += string;
1147
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001148 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001149 enumeratorString += '|';
1150 }
1151 }
1152
1153 return enumeratorString;
1154}
1155
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001156static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1157 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1158 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1159 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001160 return false;
1161 }
1162
1163 return true;
1164}
1165
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001166static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1167 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001168 return "unrecognized enumerator";
1169 }
1170
1171 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001172 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001173 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001175 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001176 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001178 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001179 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001181 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001182 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1183 }
1184
1185 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001187 enumeratorString += string;
1188
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001189 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001190 enumeratorString += '|';
1191 }
1192 }
1193
1194 return enumeratorString;
1195}
1196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001198 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001199 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001200 return false;
1201 }
1202
1203 return true;
1204}
1205
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001206static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1207 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001208 return "unrecognized enumerator";
1209 }
1210
1211 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001212 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001213 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001214 }
1215
1216 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001217 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001218 enumeratorString += string;
1219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001220 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001221 enumeratorString += '|';
1222 }
1223 }
1224
1225 return enumeratorString;
1226}
1227
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001228static const int MaxParamCheckerStringLength = 256;
1229
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001230static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001231 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001232 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001233 assert(validateString != nullptr);
1234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001235 bool skip_call = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001236
1237 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1238
1239 if (result == VK_STRING_ERROR_NONE) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001240 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001241 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001242
1243 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1244 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1245 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001246 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001247 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1248 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1249 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001250 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001251 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001252}
1253
Dustin Gravesde628532016-04-21 16:30:17 -06001254static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1255 uint32_t index) {
1256 assert(device_data != nullptr);
1257 debug_report_data *report_data = device_data->report_data;
1258 bool skip_call = false;
1259
1260 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001261 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1262 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001263 } else {
1264 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1265 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1266 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001267 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1268 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001269 function_name, parameter_name, index);
1270 return false;
1271 }
1272 }
1273
1274 return skip_call;
1275}
1276
1277static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1278 const uint32_t count, const uint32_t *indices) {
1279 assert(device_data != nullptr);
1280 debug_report_data *report_data = device_data->report_data;
1281 bool skip_call = false;
1282
1283 if (indices != nullptr) {
1284 for (uint32_t i = 0; i < count; i++) {
1285 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001286 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1287 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001288 } else {
1289 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1290 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1291 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001292 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1293 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001294 function_name, parameter_name, i, indices[i]);
1295 return false;
1296 }
1297 }
1298 }
1299 }
1300
1301 return skip_call;
1302}
1303
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001304static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001306VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1307 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001308 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001309
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001310 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001311 assert(chain_info != nullptr);
1312 assert(chain_info->u.pLayerInfo != nullptr);
1313
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001314 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1315 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001316 if (fpCreateInstance == NULL) {
1317 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001318 }
1319
Dustin Graves842621d2016-03-03 14:17:08 -07001320 // Advance the link info for the next element on the chain
1321 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1322
1323 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001324
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001325 if (result == VK_SUCCESS) {
1326 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1327 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001328
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001329 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001330
Chia-I Wua570b7c2016-05-16 07:48:14 +08001331 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001332 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1333 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001334
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001335 // Look for one or more debug report create info structures
1336 // and setup a callback(s) for each one found.
1337 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1338 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1339 if (my_instance_data->num_tmp_callbacks > 0) {
1340 // Setup the temporary callback(s) here to catch early issues:
1341 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1342 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1343 // Failure of setting up one or more of the callback.
1344 // Therefore, clean up and don't use those callbacks:
1345 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1346 my_instance_data->num_tmp_callbacks = 0;
1347 }
1348 }
1349 }
1350
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001351 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001352 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001353
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001354 // Ordinarily we'd check these before calling down the chain, but none of the layer
1355 // support is in place until now, if we survive we can report the issue now.
1356 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001357
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001358 if (pCreateInfo->pApplicationInfo) {
1359 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1360 validate_string(my_instance_data->report_data, "vkCreateInstance",
1361 "pCreateInfo->VkApplicationInfo->pApplicationName",
1362 pCreateInfo->pApplicationInfo->pApplicationName);
1363 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001364
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001365 if (pCreateInfo->pApplicationInfo->pEngineName) {
1366 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1367 pCreateInfo->pApplicationInfo->pEngineName);
1368 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001369 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001370
1371 // Disable the tmp callbacks:
1372 if (my_instance_data->num_tmp_callbacks > 0) {
1373 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1374 my_instance_data->tmp_callbacks);
1375 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001376 }
1377
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001378 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001379}
1380
Chia-I Wu01ca2372016-05-13 14:37:49 +08001381VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001382 // Grab the key before the instance is destroyed.
1383 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001384 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001385 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001386 assert(my_data != NULL);
1387
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001388 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1389 bool callback_setup = false;
1390 if (my_data->num_tmp_callbacks > 0) {
1391 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1392 my_data->tmp_callbacks)) {
1393 callback_setup = true;
1394 }
1395 }
1396
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001397 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001398
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001399 // Disable and cleanup the temporary callback(s):
1400 if (callback_setup) {
1401 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1402 }
1403 if (my_data->num_tmp_callbacks > 0) {
1404 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1405 my_data->num_tmp_callbacks = 0;
1406 }
1407
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001408 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001409 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001410 pTable->DestroyInstance(instance, pAllocator);
1411
1412 // Clean up logging callback, if any
1413 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001414 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1415 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001416 my_data->logging_callback.pop_back();
1417 }
1418
1419 layer_debug_report_destroy_instance(mid(instance));
1420 layer_data_map.erase(pTable);
1421
1422 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001423 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001424 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001425}
1426
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001427VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1428 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001429 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001430 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001431 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001432 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001434 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001435
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001436 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001437 result = get_dispatch_table(pc_instance_table_map, instance)
1438 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001439
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001440 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001441 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1442 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1443 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1444 // Save the supported features for each physical device
1445 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1446 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1447 }
1448 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001450 return result;
1451}
1452
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001453VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1454 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001455 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001456 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001457
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001458 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001460 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001461 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001462 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001463}
1464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001465VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1466 VkFormatProperties *pFormatProperties) {
1467 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001468 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001470
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001471 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001472
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001473 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001474 get_dispatch_table(pc_instance_table_map, physicalDevice)
1475 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001476 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001477}
1478
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001479VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1480 VkImageType type, VkImageTiling tiling,
1481 VkImageUsageFlags usage, VkImageCreateFlags flags,
1482 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001483 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001484 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001485 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001486 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001488 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1489 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001491 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001492 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1493 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1494 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001495
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001496 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001497 }
Chia-I Wu17241042015-10-31 00:31:16 +08001498
1499 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001500}
1501
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001502VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1503 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001504 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001505 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001507 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001509 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001510 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001511 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001512}
1513
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001514VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1515 uint32_t *pQueueFamilyPropertyCount,
1516 VkQueueFamilyProperties *pQueueFamilyProperties) {
1517 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001519 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001520
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001521 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1522 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001523
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001524 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001525 get_dispatch_table(pc_instance_table_map, physicalDevice)
1526 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001527 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001528}
1529
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001530VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1531 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1532 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001533 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001534 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001535
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001536 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001537
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001538 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001539 get_dispatch_table(pc_instance_table_map, physicalDevice)
1540 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001541 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001542}
1543
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001544void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1545 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001546 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001547
1548 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1549 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1550 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001551 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 -06001552 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001553 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1554 "structure.",
1555 i);
1556 } else {
1557 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001558 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001559
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001560 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1561 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1562 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1563 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001564 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 -06001565 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001566 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1567 "between 0 and 1. Actual value is %f",
1568 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1569 }
1570 }
1571 }
1572
1573 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1574 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001575 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001576 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001577 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1578 "of queue families.",
1579 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001580 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1581 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1582 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001583 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001584 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001585 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1586 "queues for the given family index.",
1587 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001588 }
Michael Lentine774704f2016-01-27 13:36:46 -06001589 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001590 }
1591}
1592
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001593static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001594 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001595
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001596 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001597
1598 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1599 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001600 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001601 }
1602#ifdef VK_USE_PLATFORM_XLIB_KHR
1603 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001604 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001605 }
1606#endif
1607#ifdef VK_USE_PLATFORM_XCB_KHR
1608 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001609 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001610 }
1611#endif
1612#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1613 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001614 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001615 }
1616#endif
1617#ifdef VK_USE_PLATFORM_MIR_KHR
1618 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001619 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001620 }
1621#endif
1622#ifdef VK_USE_PLATFORM_ANDROID_KHR
1623 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001624 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001625 }
1626#endif
1627#ifdef VK_USE_PLATFORM_WIN32_KHR
1628 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001629 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001630 }
1631#endif
1632 }
1633}
1634
1635static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1636 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1637 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06001638 device_data->wsi_display_swapchain_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001639
1640 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1641 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1642 device_data->wsi_enabled = true;
1643 }
Mark Youngead9b932016-09-08 12:28:38 -06001644 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
1645 device_data->wsi_display_swapchain_enabled = true;
1646 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001647 }
1648}
1649
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001650void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001651 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001652
1653 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1654 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1655 my_device_data->queueFamilyIndexMap.insert(
1656 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1657 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001658 }
1659}
1660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001661VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001662 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001663 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001664 * NOTE: We do not validate physicalDevice or any dispatchable
1665 * object as the first parameter. We couldn't get here if it was wrong!
1666 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001667
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001668 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001669 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001670 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001671 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001673 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001674
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001675 if (pCreateInfo != NULL) {
1676 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001677 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001678 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1679 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001680 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001681 }
Michael Lentine774704f2016-01-27 13:36:46 -06001682
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001683 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001684 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001685 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1686 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001687 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001688 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001689 }
1690
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001691 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001692 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001693 assert(chain_info != nullptr);
1694 assert(chain_info->u.pLayerInfo != nullptr);
1695
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001696 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1697 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001698 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001699 if (fpCreateDevice == NULL) {
1700 return VK_ERROR_INITIALIZATION_FAILED;
1701 }
1702
1703 // Advance the link info for the next element on the chain
1704 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1705
1706 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001707
1708 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1709
1710 if (result == VK_SUCCESS) {
1711 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1712 assert(my_device_data != nullptr);
1713
1714 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1715 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1716
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001717 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1718
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001719 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001720 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1721 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001722 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001723 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001724
1725 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1726 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001727
1728 // Query and save physical device limits for this device
1729 VkPhysicalDeviceProperties device_properties = {};
1730 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1731 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001732 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001733
1734 // Save app-enabled features in this device's layer_data structure
1735 if (pCreateInfo->pEnabledFeatures) {
1736 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1737 } else {
1738 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1739 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001740 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001741 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001742
Jeremy Hayes99a96322015-06-26 12:48:09 -06001743 return result;
1744}
1745
Chia-I Wu01ca2372016-05-13 14:37:49 +08001746VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001747 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001748 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001749 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1750 assert(my_data != NULL);
1751
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001752 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001754 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001755 layer_debug_report_destroy_device(device);
1756
Jeremy Hayes99a96322015-06-26 12:48:09 -06001757#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001758 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001759#endif
1760
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001761 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001762 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001763 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001764 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001765}
1766
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001767bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001768 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001769 assert(my_device_data != nullptr);
1770
Dustin Gravesde628532016-04-21 16:30:17 -06001771 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001772
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001773 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001774 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001775 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 -06001776 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001777 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1778 "was created.",
1779 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001780 return false;
1781 }
1782 return true;
1783}
1784
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001785VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1786 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001787 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001788 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001789
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001790 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001791
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001792 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001793 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1794
1795 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001796 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001797}
1798
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001799VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001800 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001801 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001802 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001803 assert(my_data != NULL);
1804
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001805 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001806
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001807 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001808 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1809
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001810 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001811 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001812
Jeremy Hayes99a96322015-06-26 12:48:09 -06001813 return result;
1814}
1815
Chia-I Wu01ca2372016-05-13 14:37:49 +08001816VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001817 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1818 assert(my_data != NULL);
1819
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001820 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001822 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001823
1824 return result;
1825}
1826
Chia-I Wu01ca2372016-05-13 14:37:49 +08001827VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001828 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1829 assert(my_data != NULL);
1830
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001831 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001832
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001833 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001834
1835 return result;
1836}
1837
Chia-I Wu01ca2372016-05-13 14:37:49 +08001838VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001839 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001840 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001841 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001842 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001843 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001844
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001845 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001846
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001847 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001848 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1849
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001850 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001851 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001852
1853 return result;
1854}
1855
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001856VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1857 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001858 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001859 assert(my_data != NULL);
1860
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001861 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001862
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001863 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001864 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001865 }
1866}
1867
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001868VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1869 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001870 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001871 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001872 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001873 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001874
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001875 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001876
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001877 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1879
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001880 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001881 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001882
1883 return result;
1884}
1885
Chia-I Wu01ca2372016-05-13 14:37:49 +08001886VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001887 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001888 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1889 assert(my_data != NULL);
1890
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001891 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001892
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001893 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001894 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1895 }
1896}
1897
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001898VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1899 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001900 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001901 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001902 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001903 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001904
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001905 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001906
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001907 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001908 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1909
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001910 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001912
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001913 return result;
1914}
1915
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001916VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1917 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001918 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001919 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001920 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001921 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001922
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001923 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001924
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001925 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001926 result =
1927 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001928
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001929 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001930 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001931
Tony Barbourb1250542015-04-16 19:23:13 -06001932 return result;
1933}
1934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001935VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1936 VkDeviceSize *pCommittedMemoryInBytes) {
1937 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001938 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001939 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001940
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001941 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001942
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001943 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001944 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001945 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001946}
1947
Chia-I Wu01ca2372016-05-13 14:37:49 +08001948VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1949 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001950 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001951 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001952 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1953 assert(my_data != NULL);
1954
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001955 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001957 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001958 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1959
1960 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1961 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001962
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001963 return result;
1964}
1965
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001966VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001967 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001968 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1970 assert(my_data != NULL);
1971
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001972 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001973
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001974 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001975 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1976
1977 validate_result(my_data->report_data, "vkBindImageMemory", result);
1978 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001979
1980 return result;
1981}
1982
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001983VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1984 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_vkGetBufferMemoryRequirements(my_data->report_data, buffer, 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)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994}
1995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001996VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1997 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002000
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002001 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002002
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002003 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002004 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002005 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002006}
2007
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002008bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2009 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2010 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002011 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002012 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2013 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002014 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 -06002015 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002016 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2017 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002018 return false;
2019 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020 }
2021
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002022 return true;
2023}
2024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002025VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2026 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2027 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002028 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002029 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002030
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002031 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2032 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002033
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002034 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002035 get_dispatch_table(pc_device_table_map, device)
2036 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002037
2038 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2039 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002040}
2041
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002042bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2043 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2044 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002045 if (pProperties != nullptr) {
2046 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2047 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002048 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 -06002049 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002050 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2051 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002052 return false;
2053 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002054 }
2055
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002056 return true;
2057}
2058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002059VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2060 VkImageType type, VkSampleCountFlagBits samples,
2061 VkImageUsageFlags usage, VkImageTiling tiling,
2062 uint32_t *pPropertyCount,
2063 VkSparseImageFormatProperties *pProperties) {
2064 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002066 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002067
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002068 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2069 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002070
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002071 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002072 get_dispatch_table(pc_instance_table_map, physicalDevice)
2073 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2074 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002075
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002076 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2077 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002078 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002079}
2080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002081VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2082 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002083 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002084 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002085 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002086 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002087
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002088 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002089
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002090 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002091 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2092
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002093 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002094 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002095
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002096 return result;
2097}
2098
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002099VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2100 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002101 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002102 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002103 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002104 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002105
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002106 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002107
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002108 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002109 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2110
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002111 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002112 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002113
2114 return result;
2115}
2116
Chia-I Wu01ca2372016-05-13 14:37:49 +08002117VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002118 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002119 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002120 assert(my_data != NULL);
2121
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002122 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002123
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002124 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002125 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002126 }
2127}
2128
Chia-I Wu01ca2372016-05-13 14:37:49 +08002129VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002130 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002131 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002132 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002133 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002134
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002135 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002136
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002137 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002138 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2139
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002140 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002141 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002142
2143 return result;
2144}
2145
Chia-I Wu01ca2372016-05-13 14:37:49 +08002146VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002147 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002148 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002149 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2150 assert(my_data != NULL);
2151
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002152 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002153
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002154 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002155 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2156
2157 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2158 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002159
2160 return result;
2161}
2162
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002163VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2164 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002165 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002166 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002167 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002168 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002169
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002170 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002171
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002172 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002173 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2174
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002175 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002176 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002177
2178 return result;
2179}
2180
Chia-I Wu01ca2372016-05-13 14:37:49 +08002181VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002182 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002183 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002184 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002185 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002186 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002187
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002188 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002189
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002190 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002191 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2192
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002193 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002194 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002195
2196 return result;
2197}
2198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002199VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2200 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002201 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002202 assert(my_data != NULL);
2203
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002204 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002205
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002206 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002207 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002208 }
2209}
2210
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002211VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2212 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002213 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002214 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002215 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002216 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002217
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002218 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002219
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002220 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002221 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2222
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002223 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002224 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002225
2226 return result;
2227}
2228
Chia-I Wu01ca2372016-05-13 14:37:49 +08002229VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002230 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002231 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002232 assert(my_data != NULL);
2233
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002234 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002235
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002236 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002237 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002238 }
2239}
2240
Chia-I Wu01ca2372016-05-13 14:37:49 +08002241VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002242 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002243 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2245 assert(my_data != NULL);
2246
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002247 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002248
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002249 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002250 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2251
2252 validate_result(my_data->report_data, "vkGetEventStatus", result);
2253 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002254
2255 return result;
2256}
2257
Chia-I Wu01ca2372016-05-13 14:37:49 +08002258VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002259 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002260 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002261 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2262 assert(my_data != NULL);
2263
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002264 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002265
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002266 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002267 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2268
2269 validate_result(my_data->report_data, "vkSetEvent", result);
2270 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002271
2272 return result;
2273}
2274
Chia-I Wu01ca2372016-05-13 14:37:49 +08002275VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002276 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002277 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002278 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2279 assert(my_data != NULL);
2280
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002281 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002283 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002284 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2285
2286 validate_result(my_data->report_data, "vkResetEvent", result);
2287 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002288
2289 return result;
2290}
2291
Chia-I Wu01ca2372016-05-13 14:37:49 +08002292VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002293 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002294 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002295 bool skip_call = false;
2296 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2297 assert(device_data != nullptr);
2298 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002299
Dustin Gravesc900f572016-05-16 11:07:59 -06002300 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002301
Dustin Gravesc900f572016-05-16 11:07:59 -06002302 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2303 if (pCreateInfo != nullptr) {
2304 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2305 // VkQueryPipelineStatisticFlagBits values
2306 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2307 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2308 skip_call |=
2309 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2310 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2311 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2312 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2313 }
2314 }
2315
2316 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002317 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2318
Dustin Gravesc900f572016-05-16 11:07:59 -06002319 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002320 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002321
2322 return result;
2323}
2324
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002325VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2326 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002328 assert(my_data != NULL);
2329
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002330 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002331
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002332 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002333 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002334 }
2335}
2336
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002337VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2338 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002339 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002340 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002341 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002342 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002343
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002344 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2345 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002346
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002347 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002348 result = get_dispatch_table(pc_device_table_map, device)
2349 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002350
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002351 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002352 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002353
2354 return result;
2355}
2356
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002357VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2358 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002359 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002360 bool skip_call = false;
2361 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2362 assert(device_data != nullptr);
2363 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002364
Karl Schultza9ef1e52016-10-06 17:53:48 -06002365 // TODO: Add check for VALIDATION_ERROR_00660
2366 // TODO: Add check for VALIDATION_ERROR_00661
2367 // TODO: Add check for VALIDATION_ERROR_00662
2368 // TODO: Add check for VALIDATION_ERROR_00670
2369 // TODO: Add check for VALIDATION_ERROR_00671
2370 // TODO: Add check for VALIDATION_ERROR_00672
2371 // TODO: Add check for VALIDATION_ERROR_00673
2372 // TODO: Add check for VALIDATION_ERROR_00674
2373 // TODO: Add check for VALIDATION_ERROR_00675
2374 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2375 // TODO: Add check for VALIDATION_ERROR_00663
Dustin Gravesc900f572016-05-16 11:07:59 -06002376 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002377
Dustin Gravesc900f572016-05-16 11:07:59 -06002378 if (pCreateInfo != nullptr) {
2379 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2380 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2381 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2382 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Karl Schultza9ef1e52016-10-06 17:53:48 -06002383 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2384 __LINE__, VALIDATION_ERROR_00665, LayerName,
2385 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2386 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2387 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002388 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002389
Dustin Gravesc900f572016-05-16 11:07:59 -06002390 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2391 // queueFamilyIndexCount uint32_t values
2392 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2393 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 -06002394 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002395 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2396 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002397 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2398 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002399 }
2400
2401 // Ensure that the queue family indices were specified at device creation
2402 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2403 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2404 }
2405 }
2406
2407 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002408 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2409
Dustin Gravesc900f572016-05-16 11:07:59 -06002410 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002411 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002412
2413 return result;
2414}
2415
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002416VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2417 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002419 assert(my_data != NULL);
2420
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002421 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002423 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002424 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002425 }
2426}
2427
Chia-I Wu01ca2372016-05-13 14:37:49 +08002428VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2429 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002430 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002431 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002432 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002433 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002435 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002437 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002438 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2439
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002440 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002441 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002442
2443 return result;
2444}
2445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002446VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2447 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002448 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002449 assert(my_data != NULL);
2450
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002451 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002452
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002453 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002454 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002455 }
2456}
2457
Chia-I Wu01ca2372016-05-13 14:37:49 +08002458VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2459 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002460 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2461 bool skip_call = false;
2462 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002463 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002464 debug_report_data *report_data = device_data->report_data;
2465
2466 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2467
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002468 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002469 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002470 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002471 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2472 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2473 skip_call |=
2474 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2475 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2476 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2477 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478
Dustin Gravesc900f572016-05-16 11:07:59 -06002479 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2480 // queueFamilyIndexCount uint32_t values
2481 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2482 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2483 __LINE__, REQUIRED_PARAMETER, LayerName,
2484 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2485 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2486 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2487 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002488
2489 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2490 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2491 }
2492
2493 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002494 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2495 skip_call |=
2496 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2497 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002498
2499 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002500 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002501
2502 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002503 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002504
2505 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2506 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2507 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2508 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002509 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002510 }
2511
2512 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2513 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2514 // extent.height must be equal
2515 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2516 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002517 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2518 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2519 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2520 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002521 }
2522
2523 if (pCreateInfo->extent.depth != 1) {
2524 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002525 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002526 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2527 }
2528 }
2529
2530 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2531 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2532 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002533 skip_call |=
2534 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2535 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2536 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002537 }
2538
2539 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2540 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2541 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2542 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002543 skip_call |=
2544 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2545 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2546 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002547 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002548 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002549
Dustin Gravesf8032f22016-05-11 18:31:44 -06002550 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002551 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2552
Dustin Gravesf8032f22016-05-11 18:31:44 -06002553 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002554 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002555
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002556 return result;
2557}
2558
Chia-I Wu01ca2372016-05-13 14:37:49 +08002559VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002560 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002561 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002562 assert(my_data != NULL);
2563
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002564 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002566 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002567 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002568 }
2569}
2570
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002571bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2572 if (pSubresource != nullptr) {
2573 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2574 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002575 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 -06002576 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002577 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2578 return false;
2579 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002580 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002581
2582 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002583}
2584
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002585VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2586 VkSubresourceLayout *pLayout) {
2587 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002589 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002590
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002591 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002592
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002593 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002594 PreGetImageSubresourceLayout(device, pSubresource);
2595
2596 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002597 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002598}
2599
Chia-I Wu01ca2372016-05-13 14:37:49 +08002600VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2601 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002602 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002603 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002604 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002605 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002606 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002607
Dustin Graves0b70a632016-04-27 17:44:56 -06002608 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002609
Dustin Graves0b70a632016-04-27 17:44:56 -06002610 if (pCreateInfo != nullptr) {
2611 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002612 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2613 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002614 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2615 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2616 "pCreateInfo->subresourceRange.layerCount must be 1",
2617 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2618 }
2619 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002620 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2621 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2622 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002623 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2624 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2625 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2626 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2627 }
2628 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002629 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2630 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002631 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2632 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2633 "pCreateInfo->subresourceRange.layerCount must be 6");
2634 }
2635 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002636 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2637 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002638 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2639 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2640 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2641 }
2642 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2643 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2644 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2645 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2646 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2647 }
2648
Dustin Graves2a80dc62016-07-12 13:57:02 -06002649 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2650 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002651 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2652 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2653 "pCreateInfo->subresourceRange.layerCount must be 1");
2654 }
2655 }
2656 }
2657
2658 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002659 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2660
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002661 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002663
2664 return result;
2665}
2666
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002667VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2668 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002669 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002670 assert(my_data != NULL);
2671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002672 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002674 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002675 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002676 }
2677}
2678
Chia-I Wu01ca2372016-05-13 14:37:49 +08002679VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002680 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002681 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002682 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002683 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002684 assert(my_data != NULL);
2685
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002686 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002687
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002688 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002689 result =
2690 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002691
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002692 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002693 }
2694
Michael Lentine03d8e572015-09-15 14:59:14 -05002695 return result;
2696}
2697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002698VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2699 const VkAllocationCallbacks *pAllocator) {
2700 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002701 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002702 assert(my_data != NULL);
2703
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002704 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002705
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002706 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002707 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002708 }
2709}
2710
Chia-I Wu01ca2372016-05-13 14:37:49 +08002711VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002712 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002713 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002714 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002715 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002716 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002718 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002719
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002720 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002721 result =
2722 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002723
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002724 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002725 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002726
2727 return result;
2728}
2729
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002730VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2731 const VkAllocationCallbacks *pAllocator) {
2732 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002733 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002734 assert(my_data != NULL);
2735
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002736 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002738 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002739 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002740 }
2741}
2742
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002743VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2744 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002745 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002746 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002747 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002748 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002750 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002751
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002752 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002753 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2754
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002755 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002756 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002757
2758 return result;
2759}
2760
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002761VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2762 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002763 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002764 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002765 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002766 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002767
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002768 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002770 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002771 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2772
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002773 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002774 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002775
2776 return result;
2777}
2778
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002779bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002780 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2781
2782 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002783 if (pCreateInfos != nullptr) {
2784 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2785 if (pCreateInfos->basePipelineIndex != -1) {
2786 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002787 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 -06002788 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002789 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2790 "pCreateInfos->flags "
2791 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2792 return false;
2793 }
2794 }
2795
2796 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2797 if (pCreateInfos->basePipelineIndex != -1) {
2798 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002799 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 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002801 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2802 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2803 "VK_NULL_HANDLE");
2804 return false;
2805 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002806 }
2807 }
2808
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002810 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002811 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 -06002812 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002813 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2814 "unrecognized enumerator");
2815 return false;
2816 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002817
2818 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2819 (data->physical_device_features.fillModeNonSolid == false)) {
2820 log_msg(
2821 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2822 DEVICE_FEATURE, LayerName,
2823 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2824 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2825 return false;
2826 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002827 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002828
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002829 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002830 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002831 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2832 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002833 pCreateInfos[i].pStages[j].pName);
2834 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002835 }
2836
2837 return true;
2838}
2839
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002840VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2841 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2842 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002843 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002844 bool skip_call = false;
2845 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2846 assert(device_data != nullptr);
2847 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002848
Dustin Gravesc900f572016-05-16 11:07:59 -06002849 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2850 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002851
Dustin Gravesc900f572016-05-16 11:07:59 -06002852 if (pCreateInfos != nullptr) {
2853 for (uint32_t i = 0; i < createInfoCount; ++i) {
2854 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2855 if (pCreateInfos[i].pTessellationState == nullptr) {
2856 if (pCreateInfos[i].pStages != nullptr) {
2857 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2858 // pTessellationState must not be NULL
2859 bool has_control = false;
2860 bool has_eval = false;
2861
2862 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2863 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2864 has_control = true;
2865 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2866 has_eval = true;
2867 }
2868 }
2869
2870 if (has_control && has_eval) {
2871 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2872 __LINE__, REQUIRED_PARAMETER, LayerName,
2873 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2874 "control shader stage and a tessellation evaluation shader stage, "
2875 "pCreateInfos[%d].pTessellationState must not be NULL",
2876 i, i);
2877 }
2878 }
Dustin Graves629259b2016-05-30 16:14:27 -06002879 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002880 skip_call |= validate_struct_pnext(
2881 report_data, "vkCreateGraphicsPipelines",
2882 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2883 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002884
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002885 skip_call |= validate_reserved_flags(
2886 report_data, "vkCreateGraphicsPipelines",
2887 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2888 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002889
2890 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2891 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2892 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2893 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2894 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2895 i);
2896 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002897 }
2898
2899 if (pCreateInfos[i].pViewportState == nullptr) {
2900 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2901 // valid VkPipelineViewportStateCreateInfo structure
2902 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2903 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2904 skip_call |= log_msg(
2905 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2906 REQUIRED_PARAMETER, LayerName,
2907 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2908 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2909 i, i);
2910 }
2911 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002912 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002913 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2914 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2915 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002916
2917 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002918 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2919 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002920 pCreateInfos[i].pViewportState->flags);
2921
Dustin Gravesc900f572016-05-16 11:07:59 -06002922 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2923 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2924 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2925 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2926 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2927 i);
2928 }
2929
2930 if (pCreateInfos[i].pDynamicState != nullptr) {
2931 bool has_dynamic_viewport = false;
2932 bool has_dynamic_scissor = false;
2933
2934 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2935 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2936 has_dynamic_viewport = true;
2937 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2938 has_dynamic_scissor = true;
2939 }
2940 }
2941
2942 // viewportCount must be greater than 0
2943 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2944 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2945 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2946 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002947 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2948 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002949 "must be greater than 0",
2950 i, i);
2951 }
2952
2953 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2954 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2955 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2956 skip_call |=
2957 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2958 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002959 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002960 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2961 i, i);
2962 }
2963
2964 // scissorCount must be greater than 0
2965 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2966 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2967 skip_call |= 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 "
2970 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002971 "must be greater than 0",
2972 i, i);
2973 }
2974
2975 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2976 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2977 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2978 skip_call |=
2979 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2980 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002981 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002982 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2983 i, i);
2984 }
2985 }
2986 }
2987
2988 if (pCreateInfos[i].pMultisampleState == nullptr) {
2989 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2990 // a valid VkPipelineMultisampleStateCreateInfo structure
2991 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2992 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2993 skip_call |=
2994 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2995 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2996 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2997 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2998 i, i);
2999 }
Dustin Graves629259b2016-05-30 16:14:27 -06003000 } else {
3001 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003002 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3003 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003004 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003005
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003006 skip_call |= validate_reserved_flags(
3007 report_data, "vkCreateGraphicsPipelines",
3008 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
3009 pCreateInfos[i].pMultisampleState->flags);
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->sampleShadingEnable", ParameterName::IndexVector{i}),
3014 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003015
3016 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003017 report_data, "vkCreateGraphicsPipelines",
3018 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3019 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3020 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3021 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003022
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003023 skip_call |= validate_bool32(
3024 report_data, "vkCreateGraphicsPipelines",
3025 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3026 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003027
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003028 skip_call |= validate_bool32(
3029 report_data, "vkCreateGraphicsPipelines",
3030 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3031 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003032
3033 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3034 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3035 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3036 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3037 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3038 i);
3039 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003040 }
3041
3042 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003043 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003044 skip_call |= validate_struct_pnext(
3045 report_data, "vkCreateGraphicsPipelines",
3046 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3047 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003048
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003049 skip_call |= validate_reserved_flags(
3050 report_data, "vkCreateGraphicsPipelines",
3051 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3052 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003053
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003054 skip_call |= validate_bool32(
3055 report_data, "vkCreateGraphicsPipelines",
3056 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3057 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003058
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003059 skip_call |= validate_bool32(
3060 report_data, "vkCreateGraphicsPipelines",
3061 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3062 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003063
3064 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003065 report_data, "vkCreateGraphicsPipelines",
3066 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3067 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3068 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003069
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003070 skip_call |= validate_bool32(
3071 report_data, "vkCreateGraphicsPipelines",
3072 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3073 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003074
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003075 skip_call |= validate_bool32(
3076 report_data, "vkCreateGraphicsPipelines",
3077 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3078 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
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.failOp", ParameterName::IndexVector{i}),
3083 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3084 pCreateInfos[i].pDepthStencilState->front.failOp);
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.passOp", ParameterName::IndexVector{i}),
3089 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3090 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003091
3092 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003093 report_data, "vkCreateGraphicsPipelines",
3094 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3095 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3096 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003097
3098 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003099 report_data, "vkCreateGraphicsPipelines",
3100 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3101 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3102 pCreateInfos[i].pDepthStencilState->front.compareOp);
3103
3104 skip_call |= validate_ranged_enum(
3105 report_data, "vkCreateGraphicsPipelines",
3106 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003107 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3108
3109 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003110 report_data, "vkCreateGraphicsPipelines",
3111 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003112 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3113
3114 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003115 report_data, "vkCreateGraphicsPipelines",
3116 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3117 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3118 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003119
3120 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003121 report_data, "vkCreateGraphicsPipelines",
3122 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3123 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3124 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003125
3126 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3127 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3128 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3129 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3130 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3131 i);
3132 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003133 }
3134
3135 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3136 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003137 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003138 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3139 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3140 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003141
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003142 skip_call |= validate_reserved_flags(
3143 report_data, "vkCreateGraphicsPipelines",
3144 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3145 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003146
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003147 skip_call |= validate_bool32(
3148 report_data, "vkCreateGraphicsPipelines",
3149 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3150 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003151
3152 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003153 report_data, "vkCreateGraphicsPipelines",
3154 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3155 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3156 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003157
3158 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3159 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3160 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003161 skip_call |=
3162 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3163 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3164 ParameterName::IndexVector{i, attachmentIndex}),
3165 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003166
3167 skip_call |= validate_ranged_enum(
3168 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003169 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3170 ParameterName::IndexVector{i, attachmentIndex}),
3171 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003172 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3173
3174 skip_call |= validate_ranged_enum(
3175 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003176 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3177 ParameterName::IndexVector{i, attachmentIndex}),
3178 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003179 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3180
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003181 skip_call |=
3182 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3183 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3184 ParameterName::IndexVector{i, attachmentIndex}),
3185 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3186 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003187
3188 skip_call |= validate_ranged_enum(
3189 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003190 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3191 ParameterName::IndexVector{i, attachmentIndex}),
3192 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003193 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3194
3195 skip_call |= validate_ranged_enum(
3196 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003197 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3198 ParameterName::IndexVector{i, attachmentIndex}),
3199 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003200 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3201
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003202 skip_call |=
3203 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3204 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3205 ParameterName::IndexVector{i, attachmentIndex}),
3206 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3207 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003208
3209 skip_call |=
3210 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003211 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3212 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003213 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3214 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3215 }
3216 }
3217
Dustin Gravesc900f572016-05-16 11:07:59 -06003218 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3219 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3220 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3221 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3222 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3223 i);
3224 }
3225
3226 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3227 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3228 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003229 report_data, "vkCreateGraphicsPipelines",
3230 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003231 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3232 }
3233 }
3234 }
3235 }
3236
3237 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003238 PreCreateGraphicsPipelines(device, pCreateInfos);
3239
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003240 result = get_dispatch_table(pc_device_table_map, device)
3241 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003242
Dustin Gravesc900f572016-05-16 11:07:59 -06003243 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003244 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003245
3246 return result;
3247}
3248
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003249bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003250 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3251
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003252 if (pCreateInfos != nullptr) {
3253 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003254 uint32_t i = 0;
3255 validate_string(data->report_data, "vkCreateComputePipelines",
3256 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003257 }
3258
3259 return true;
3260}
3261
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003262VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3263 const VkComputePipelineCreateInfo *pCreateInfos,
3264 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003265 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003266 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003267 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003268 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003269
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003270 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3271 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003272
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003273 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003274 PreCreateComputePipelines(device, pCreateInfos);
3275
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003276 result = get_dispatch_table(pc_device_table_map, device)
3277 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003278
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003279 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003280 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003281
3282 return result;
3283}
3284
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003285VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3286 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003287 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003288 assert(my_data != NULL);
3289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003290 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003291
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003292 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003293 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003294 }
3295}
3296
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003297VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3298 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003299 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003300 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003301 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003302 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003304 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003306 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307 result =
3308 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003309
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003310 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003311 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003312
3313 return result;
3314}
3315
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003316VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3317 const VkAllocationCallbacks *pAllocator) {
3318 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003319 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003320 assert(my_data != NULL);
3321
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003322 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003324 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003325 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003326 }
3327}
3328
Chia-I Wu01ca2372016-05-13 14:37:49 +08003329VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3330 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003331 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003332 bool skip_call = false;
3333 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3334 assert(device_data != NULL);
3335 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003336
Dustin Gravesc900f572016-05-16 11:07:59 -06003337 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003338
Dustin Gravesc900f572016-05-16 11:07:59 -06003339 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3340 if (pCreateInfo != nullptr) {
3341 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3342 if (pCreateInfo->compareEnable == VK_TRUE) {
3343 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3344 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3345 }
3346
3347 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3348 // valid VkBorderColor value
3349 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3350 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3351 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3352 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3353 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3354 }
3355 }
3356
3357 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003358 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3359
Dustin Gravesc900f572016-05-16 11:07:59 -06003360 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003361 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003362
3363 return result;
3364}
3365
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003366VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3367 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003368 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003369 assert(my_data != NULL);
3370
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003371 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003372
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003373 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003374 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003375 }
3376}
3377
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003378VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3379 const VkAllocationCallbacks *pAllocator,
3380 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003381 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003382 bool skip_call = false;
3383 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3384 assert(device_data != nullptr);
3385 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003386
Dustin Gravesc900f572016-05-16 11:07:59 -06003387 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003388
Dustin Gravesc900f572016-05-16 11:07:59 -06003389 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3390 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3391 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3392 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3393 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3394 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3395 // valid VkSampler handles
3396 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3397 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3398 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3399 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3400 ++descriptor_index) {
3401 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3402 skip_call |=
3403 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3404 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3405 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3406 " specified as VK_NULL_HANDLE",
3407 i, descriptor_index);
3408 }
3409 }
3410 }
3411
3412 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3413 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3414 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3415 skip_call |=
3416 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3417 UNRECOGNIZED_VALUE, LayerName,
3418 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3419 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3420 i, i);
3421 }
3422 }
3423 }
3424 }
3425
3426 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003427 result =
3428 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003429
Dustin Gravesc900f572016-05-16 11:07:59 -06003430 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003431 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003432
3433 return result;
3434}
3435
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003436VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3437 const VkAllocationCallbacks *pAllocator) {
3438 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003440 assert(my_data != NULL);
3441
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003442 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003443
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003444 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003445 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003446 }
3447}
3448
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003449VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3450 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003451 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003452 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003453 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003454 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003455
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003456 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003457
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003458 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3459
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003460 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003461 result =
3462 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003463
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003464 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003465 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003466
3467 return result;
3468}
3469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003470VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3471 const VkAllocationCallbacks *pAllocator) {
3472 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003474 assert(my_data != NULL);
3475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003476 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003477
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003478 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003479 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003480 }
3481}
3482
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003483VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3484 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003485 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003486 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003487 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3488 assert(my_data != NULL);
3489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003490 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003491
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003492 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003493 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3494
3495 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3496 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003497
3498 return result;
3499}
3500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003501VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3502 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003503 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003504 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003505 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003506 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003508 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003509
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003510 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003511 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3512
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003513 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003514 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003515
3516 return result;
3517}
3518
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003519VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003520 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003521 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003522 bool skip_call = false;
3523 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3524 assert(device_data != nullptr);
3525 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003526
Dustin Gravesc900f572016-05-16 11:07:59 -06003527 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003528
Dustin Gravesc900f572016-05-16 11:07:59 -06003529 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3530 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3531 // validate_array()
3532 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3533 pDescriptorSets, true, true);
3534
3535 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003536 result = get_dispatch_table(pc_device_table_map, device)
3537 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003538
Dustin Gravesc900f572016-05-16 11:07:59 -06003539 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003540 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003541
3542 return result;
3543}
3544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003545VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3546 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3547 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003548 bool skip_call = false;
3549 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3550 assert(device_data != NULL);
3551 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003552
Dustin Gravesc900f572016-05-16 11:07:59 -06003553 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3554 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003555
Dustin Gravesc900f572016-05-16 11:07:59 -06003556 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3557 if (pDescriptorWrites != NULL) {
3558 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3559 // descriptorCount must be greater than 0
3560 if (pDescriptorWrites[i].descriptorCount == 0) {
3561 skip_call |=
3562 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3563 REQUIRED_PARAMETER, LayerName,
3564 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3565 }
3566
3567 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3568 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3569 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3570 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3571 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3572 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3573 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3574 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3575 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3576 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3577 __LINE__, REQUIRED_PARAMETER, LayerName,
3578 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3579 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3580 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3581 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3582 i, i);
3583 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3584 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3585 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3586 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3587 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3588 ++descriptor_index) {
3589 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003590 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3591 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003592 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3593 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003594 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3595 ParameterName::IndexVector{i, descriptor_index}),
3596 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003597 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3598 }
3599 }
3600 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3601 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3602 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3603 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3604 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3605 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3606 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3607 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3608 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3609 __LINE__, REQUIRED_PARAMETER, LayerName,
3610 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3611 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3612 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3613 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3614 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003615 } else {
3616 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3617 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003618 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3619 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003620 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3621 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003622 }
3623 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3624 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3625 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3626 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3627 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3628 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3629 __LINE__, REQUIRED_PARAMETER, LayerName,
3630 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3631 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3632 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3633 i, i);
3634 } else {
3635 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3636 ++descriptor_index) {
3637 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003638 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3639 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003640 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3641 }
3642 }
3643 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003644
3645 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3646 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3647 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3648 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3649 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3650 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3651 skip_call |=
3652 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003653 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003654 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3655 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3656 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3657 }
3658 }
3659 }
3660 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3661 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3662 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3663 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3664 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3665 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3666 skip_call |=
3667 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003668 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003669 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3670 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3671 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3672 }
3673 }
3674 }
3675 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003676 }
3677 }
3678
3679 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003680 get_dispatch_table(pc_device_table_map, device)
3681 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003682 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003683}
3684
Chia-I Wu01ca2372016-05-13 14:37:49 +08003685VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003686 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003687 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003688 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003689 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003690 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003692 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003694 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003695 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3696
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003697 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003698 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003699
3700 return result;
3701}
3702
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003703VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3704 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003705 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003706 assert(my_data != NULL);
3707
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003708 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003710 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003711 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003712 }
3713}
3714
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003715bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3716 bool skip_call = false;
3717 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3718
3719 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3720 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3721 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 -06003722 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003723 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3724 }
3725 }
3726 return skip_call;
3727}
3728
Chia-I Wu01ca2372016-05-13 14:37:49 +08003729VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003730 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003731 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003732 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003733 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003734 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003735
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003736 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3737 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003738
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003739 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003740 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3741
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003742 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003743 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003744
3745 return result;
3746}
3747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003748VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
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 Graves27a912a2016-03-07 17:52:14 -07003751 assert(my_data != NULL);
3752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003753 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003754
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003755 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003756 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003757 }
3758}
3759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003760VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3761 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003763 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003764
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003765 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003767 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003768 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003769 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003770}
3771
Chia-I Wu01ca2372016-05-13 14:37:49 +08003772VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003773 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003774 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003775 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003776 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003777 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003779 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003780 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003782 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003783
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003784 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003785 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3786
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003787 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003788 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003789
3790 return result;
3791}
3792
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003793VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3794 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003796 assert(my_data != NULL);
3797
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003798 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003799
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003800 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003801 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003802 }
3803}
3804
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003805VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003806 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003807 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003808 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3809 assert(my_data != NULL);
3810
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003811 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003812
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003813 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003814 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3815
3816 validate_result(my_data->report_data, "vkResetCommandPool", result);
3817 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003818
3819 return result;
3820}
3821
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003822VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3823 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003824 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003825 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003826 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003827 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003828
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003829 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003830
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003831 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003832 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3833
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003834 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003835 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003836
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003837 return result;
3838}
3839
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003840VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003841 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003842 bool skip_call = false;
3843 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3844 assert(device_data != nullptr);
3845 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003846
Dustin Gravesc900f572016-05-16 11:07:59 -06003847 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003848
Dustin Gravesc900f572016-05-16 11:07:59 -06003849 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3850 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3851 // validate_array()
3852 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3853 pCommandBuffers, true, true);
3854
3855 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003856 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003857 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003858 }
3859}
3860
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003861bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3862 bool skip_call = false;
3863 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3864 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3865
3866 if (pInfo != NULL) {
3867 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3868 skip_call |=
3869 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 -06003870 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003871 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3872 "inheritedQueries.");
3873 }
3874
3875 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3876 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3877 skip_call |=
3878 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 -06003879 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003880 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3881 "valid combination of VkQueryControlFlagBits.",
3882 pInfo->queryFlags);
3883 }
3884 }
3885 return skip_call;
3886}
3887
3888VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003889 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003890 bool skip_call = false;
3891 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3892 assert(device_data != nullptr);
3893 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003894
Dustin Gravesc900f572016-05-16 11:07:59 -06003895 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003896
Dustin Gravesc900f572016-05-16 11:07:59 -06003897 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3898 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3899 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3900 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3901 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3902
3903 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003904 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003905 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003906
3907 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3908 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3909
Dustin Gravesc900f572016-05-16 11:07:59 -06003910 // TODO: This only needs to be validated when the inherited queries feature is enabled
3911 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3912 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3913
3914 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3915 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3916 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3917 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3918 }
3919
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003920 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3921
Dustin Gravesc900f572016-05-16 11:07:59 -06003922 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003923 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3924
Dustin Gravesc900f572016-05-16 11:07:59 -06003925 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003926 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003927
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003928 return result;
3929}
3930
Chia-I Wu01ca2372016-05-13 14:37:49 +08003931VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
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
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003935 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003936
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003937 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003938
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003939 return result;
3940}
3941
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003942VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003943 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3945 assert(my_data != NULL);
3946
Dustin Graves16d18972016-05-09 17:36:57 -06003947 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003948
Dustin Graves16d18972016-05-09 17:36:57 -06003949 if (!skip_call) {
3950 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3951
3952 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3953 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003954
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003955 return result;
3956}
3957
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003958VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3959 VkPipeline pipeline) {
3960 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003961 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3962 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003963
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003964 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003965
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003966 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003967 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3968 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003969}
3970
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003971bool preCmdSetViewport(debug_report_data *report_data, uint32_t viewport_count, const VkViewport *viewports) {
3972 bool skip =
3973 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
3974 return skip;
3975}
3976
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003977VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3978 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003979 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003980 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003981 assert(my_data != NULL);
3982
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003983 skip |= preCmdSetViewport(my_data->report_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003984
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003985 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003986 get_dispatch_table(pc_device_table_map, commandBuffer)
3987 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003988 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003989}
3990
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003991VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3992 const VkRect2D *pScissors) {
3993 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003994 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003995 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06003996 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07003997
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003998 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003999
Mike Weiblena4742dc2016-10-31 11:05:56 -06004000 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4001 const VkRect2D &pScissor = pScissors[scissorIndex];
4002
4003 if (pScissor.offset.x < 0) {
4004 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4005 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4006 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4007 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
4008 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4009 VALIDATION_ERROR_01490, LayerName,
4010 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4011 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4012 }
4013
4014 if (pScissor.offset.y < 0) {
4015 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4016 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4017 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4018 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
4019 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4020 VALIDATION_ERROR_01491, LayerName,
4021 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4022 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4023 }
4024 }
4025
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004026 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004027 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4028 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004029}
4030
Chia-I Wu01ca2372016-05-13 14:37:49 +08004031VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004032 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004033}
4034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004035VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4036 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004037 get_dispatch_table(pc_device_table_map, commandBuffer)
4038 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004039}
4040
Chia-I Wu01ca2372016-05-13 14:37:49 +08004041VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004042 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004043 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004044 assert(my_data != NULL);
4045
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004046 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004047
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004048 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004049 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4050 }
Cody Northrop12365112015-08-17 11:10:49 -06004051}
4052
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004053VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004054 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004055}
4056
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004057VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4058 uint32_t compareMask) {
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_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
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)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4067 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004068}
4069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004070VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
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_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
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)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4079 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004080}
4081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004082VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4083 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004084 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4085 assert(my_data != NULL);
4086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004087 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004089 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004090 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4091 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004092}
4093
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004094VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4095 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4096 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4097 const uint32_t *pDynamicOffsets) {
4098 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004100 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004101
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004102 skip_call |=
4103 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4104 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004106 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004107 get_dispatch_table(pc_device_table_map, commandBuffer)
4108 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4109 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004110 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004111}
4112
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004113VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4114 VkIndexType indexType) {
4115 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004116 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4117 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004118
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004119 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004120
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004121 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004122 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4123 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004124}
4125
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004126VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4127 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4128 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004129 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004130 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004131
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004132 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004133
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004134 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004135 get_dispatch_table(pc_device_table_map, commandBuffer)
4136 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004137 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004138}
4139
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004140bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4141 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004142 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004143 // 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 -07004144 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004145 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 -06004146 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004147 return false;
4148 }
4149
4150 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004151 // 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 -07004152 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004153 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 -06004154 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004155 return false;
4156 }
4157
4158 return true;
4159}
4160
Chia-I Wu01ca2372016-05-13 14:37:49 +08004161VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4162 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004163 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004164
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004165 get_dispatch_table(pc_device_table_map, commandBuffer)
4166 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004167}
4168
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004169VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4170 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004171 get_dispatch_table(pc_device_table_map, commandBuffer)
4172 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004173}
4174
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004175VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4176 uint32_t stride) {
4177 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004178 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4179 assert(my_data != NULL);
4180
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004181 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004182
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004183 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004184 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4185 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004186}
4187
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004188VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4189 uint32_t count, uint32_t stride) {
4190 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004191 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4192 assert(my_data != NULL);
4193
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004194 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004195
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004196 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004197 get_dispatch_table(pc_device_table_map, commandBuffer)
4198 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4199 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004200}
4201
Chia-I Wu01ca2372016-05-13 14:37:49 +08004202VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004203 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004204}
4205
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004206VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4207 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004208 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4209 assert(my_data != NULL);
4210
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004211 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004212
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004213 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004214 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4215 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004216}
4217
Chia-I Wu01ca2372016-05-13 14:37:49 +08004218VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4219 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004220 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004221 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004222 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004223
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004224 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004225
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004226 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004227 get_dispatch_table(pc_device_table_map, commandBuffer)
4228 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004229 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004230}
4231
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004232bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4233 if (pRegions != nullptr) {
4234 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4235 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004236 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 -06004237 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004238 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4239 return false;
4240 }
4241 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4242 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004243 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 -06004244 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004245 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4246 return false;
4247 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004248 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004249
4250 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004251}
4252
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004253VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4254 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4255 const VkImageCopy *pRegions) {
4256 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004257 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004258 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004259
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004260 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4261 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004262
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004263 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004264 PreCmdCopyImage(commandBuffer, pRegions);
4265
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004266 get_dispatch_table(pc_device_table_map, commandBuffer)
4267 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004268 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004269}
4270
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004271bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4272 if (pRegions != nullptr) {
4273 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4274 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004275 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 -06004276 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004277 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4278 return false;
4279 }
4280 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4281 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004282 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 -06004283 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004284 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4285 return false;
4286 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004287 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004288
4289 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004290}
4291
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004292VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4293 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4294 const VkImageBlit *pRegions, VkFilter filter) {
4295 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004296 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004297 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004298
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004299 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4300 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004301
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004302 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004303 PreCmdBlitImage(commandBuffer, pRegions);
4304
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004305 get_dispatch_table(pc_device_table_map, commandBuffer)
4306 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004307 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004308}
4309
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004310bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4311 if (pRegions != nullptr) {
4312 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4313 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004314 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 -06004315 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004316 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4317 "enumerator");
4318 return false;
4319 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004320 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004321
4322 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004323}
4324
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004325VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4326 VkImageLayout dstImageLayout, uint32_t regionCount,
4327 const VkBufferImageCopy *pRegions) {
4328 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004329 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004330 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004331
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004332 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4333 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004334
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004335 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004336 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4337
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004338 get_dispatch_table(pc_device_table_map, commandBuffer)
4339 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004340 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004341}
4342
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004343bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4344 if (pRegions != nullptr) {
4345 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4346 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004347 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 -06004348 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004349 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4350 "enumerator");
4351 return false;
4352 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004353 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004354
4355 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004356}
4357
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004358VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4359 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4360 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004361 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004362 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004363
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004364 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4365 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004366
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004367 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004368 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4369
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004370 get_dispatch_table(pc_device_table_map, commandBuffer)
4371 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004372 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004373}
4374
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004375VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4376 VkDeviceSize dataSize, const uint32_t *pData) {
4377 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004378 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004379 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004380
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004381 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004382
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004383 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004384 skip_call |= log_msg(
4385 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4386 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004387 }
4388
4389 if ((dataSize <= 0) || (dataSize > 65536)) {
4390 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 -06004391 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4392 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004393 dataSize);
4394 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004395 skip_call |= log_msg(
4396 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4397 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004398 }
4399
4400 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004401 get_dispatch_table(pc_device_table_map, commandBuffer)
4402 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004403 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004404}
4405
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004406VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4407 VkDeviceSize size, uint32_t data) {
4408 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004409 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4410 assert(my_data != NULL);
4411
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004412 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004413
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004414 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004415 skip_call |= log_msg(
4416 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4417 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004418 }
4419
4420 if (size != VK_WHOLE_SIZE) {
4421 if (size <= 0) {
4422 skip_call |= log_msg(
4423 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004424 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004425 } else if (size & 3) {
4426 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 -06004427 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004428 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4429 }
4430 }
4431
4432 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004433 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4434 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004435}
4436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004437VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4438 const VkClearColorValue *pColor, uint32_t rangeCount,
4439 const VkImageSubresourceRange *pRanges) {
4440 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004441 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004442 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004443
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004444 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004446 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004447 get_dispatch_table(pc_device_table_map, commandBuffer)
4448 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004449 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004450}
4451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004452VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4453 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4454 const VkImageSubresourceRange *pRanges) {
4455 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004456 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004457 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004459 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4460 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004461
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004462 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004463 get_dispatch_table(pc_device_table_map, commandBuffer)
4464 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004465 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004466}
4467
Chia-I Wu01ca2372016-05-13 14:37:49 +08004468VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4469 const VkClearAttachment *pAttachments, uint32_t rectCount,
4470 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004471 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004472 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004473 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004475 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004477 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004478 get_dispatch_table(pc_device_table_map, commandBuffer)
4479 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004480 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004481}
4482
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004483bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4484 if (pRegions != nullptr) {
4485 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4486 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4487 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004488 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004489 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004490 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4491 return false;
4492 }
4493 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4494 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4495 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004496 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004497 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004498 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4499 return false;
4500 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004501 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004502
4503 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004504}
4505
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004506VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4507 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4508 const VkImageResolve *pRegions) {
4509 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004510 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004511 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004512
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004513 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4514 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004515
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004516 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004517 PreCmdResolveImage(commandBuffer, pRegions);
4518
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004519 get_dispatch_table(pc_device_table_map, commandBuffer)
4520 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004521 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004522}
4523
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004524VKAPI_ATTR void VKAPI_CALL CmdSetEvent(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_vkCmdSetEvent(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)->CmdSetEvent(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 CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4537 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4539 assert(my_data != NULL);
4540
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004541 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004542
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004543 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004544 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4545 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004546}
4547
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004548VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4549 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4550 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4551 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4552 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4553 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004554 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004555 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004556
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004557 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4558 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4559 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004560
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004561 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004562 get_dispatch_table(pc_device_table_map, commandBuffer)
4563 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4564 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004565 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004566}
4567
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004568VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4569 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4570 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4571 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4572 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4573 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004574 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004575 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004576
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004577 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4578 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4579 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004580
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004581 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004582 get_dispatch_table(pc_device_table_map, commandBuffer)
4583 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4584 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004585 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004586}
4587
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004588VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4589 VkQueryControlFlags flags) {
4590 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_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
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)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004599}
4600
Chia-I Wu01ca2372016-05-13 14:37:49 +08004601VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004602 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004603 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4604 assert(my_data != NULL);
4605
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004606 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004607
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004608 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004609 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4610 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004611}
4612
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004613VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4614 uint32_t queryCount) {
4615 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004616 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4617 assert(my_data != NULL);
4618
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004619 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004620
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004621 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004622 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4623 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004624}
4625
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004626bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4627 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004628
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004629 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004630
4631 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004632}
4633
Chia-I Wu01ca2372016-05-13 14:37:49 +08004634VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4635 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004636 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004637 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4638 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004639
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004640 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004641
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004642 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004643 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4644
4645 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4646 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004647}
4648
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004649VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4650 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4651 VkDeviceSize stride, VkQueryResultFlags flags) {
4652 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004653 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4654 assert(my_data != NULL);
4655
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004656 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4657 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004658
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004659 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004660 get_dispatch_table(pc_device_table_map, commandBuffer)
4661 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4662 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004663}
4664
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004665VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4666 uint32_t offset, uint32_t size, const void *pValues) {
4667 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004668 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004669 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004671 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004673 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004674 get_dispatch_table(pc_device_table_map, commandBuffer)
4675 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004676 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004677}
4678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004679VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4680 VkSubpassContents contents) {
4681 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004683 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004685 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004686
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004687 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004688 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004689 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004690}
4691
Chia-I Wu01ca2372016-05-13 14:37:49 +08004692VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004693 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004694 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4695 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004697 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004698
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004699 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004700 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4701 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004702}
4703
Chia-I Wu01ca2372016-05-13 14:37:49 +08004704VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004705 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004706}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004707
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004708VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4709 const VkCommandBuffer *pCommandBuffers) {
4710 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004711 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004712 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004713
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004714 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004715
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004716 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004717 get_dispatch_table(pc_device_table_map, commandBuffer)
4718 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004719 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004720}
4721
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004722VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004723 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4724}
4725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004726VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4727 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004728 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4729}
4730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004731VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4732 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004733 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4734 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4735
4736 return VK_ERROR_LAYER_NOT_PRESENT;
4737}
4738
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004739VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4740 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004741 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004742 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004743 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004744
4745 assert(physicalDevice);
4746
4747 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4748 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004749}
4750
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004751// WSI Extension Functions
4752
4753VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004754 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004755 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004756 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004757 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4758 assert(my_data != NULL);
4759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004760 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004761
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004762 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004763 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4764
4765 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4766 }
4767
4768 return result;
4769}
4770
4771VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004772 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004774 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4776 assert(my_data != NULL);
4777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004778 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004779 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4780
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004781 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004782 result = get_dispatch_table(pc_device_table_map, device)
4783 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4784
4785 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4786 }
4787
4788 return result;
4789}
4790
4791VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004792 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004793 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004794 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4796 assert(my_data != NULL);
4797
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004798 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004799 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4800
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004801 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004802 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004803 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804
4805 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4806 }
4807
4808 return result;
4809}
4810
4811VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4812 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004813 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004814 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4815 assert(my_data != NULL);
4816
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004817 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004818
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004819 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004820 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4821
4822 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4823 }
4824
4825 return result;
4826}
4827
4828VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4829 VkSurfaceKHR surface, VkBool32 *pSupported) {
4830 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004831 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004832 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4833 assert(my_data != NULL);
4834
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004835 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004836 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4837
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004838 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004839 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4840 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4841
4842 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4843 }
4844
4845 return result;
4846}
4847
4848VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4849 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4850 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004851 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004852 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4853 assert(my_data != NULL);
4854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004855 skip_call |=
4856 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004857
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004858 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004859 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4860 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4861
4862 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4863 }
4864
4865 return result;
4866}
4867
4868VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4869 uint32_t *pSurfaceFormatCount,
4870 VkSurfaceFormatKHR *pSurfaceFormats) {
4871 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004872 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4874 assert(my_data != NULL);
4875
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004876 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4877 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004878
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004879 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004880 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4881 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4882
4883 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4884 }
4885
4886 return result;
4887}
4888
4889VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4890 uint32_t *pPresentModeCount,
4891 VkPresentModeKHR *pPresentModes) {
4892 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004893 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004894 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4895 assert(my_data != NULL);
4896
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004897 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4898 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004899
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004900 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004901 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4902 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4903
4904 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4905 }
4906
4907 return result;
4908}
4909
4910#ifdef VK_USE_PLATFORM_WIN32_KHR
4911VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4912 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4913 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4914
4915 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4916 assert(my_data != NULL);
4917
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004918 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004919
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004920 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004921 result =
4922 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4923 }
4924
4925 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4926
4927 return result;
4928}
4929#endif // VK_USE_PLATFORM_WIN32_KHR
4930
4931#ifdef VK_USE_PLATFORM_XCB_KHR
4932VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4933 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4934 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4935
4936 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4937 assert(my_data != NULL);
4938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004939 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004940
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004941 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 result =
4943 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4944 }
4945
4946 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4947
4948 return result;
4949}
4950
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004951VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4952 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4953 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004954 VkBool32 result = false;
4955
4956 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4957 assert(my_data != NULL);
4958
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004959 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4960 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004961
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004962 if (!skip_call) {
4963 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4964 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004965 }
4966
4967 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004968}
4969#endif // VK_USE_PLATFORM_XCB_KHR
4970
4971#ifdef VK_USE_PLATFORM_XLIB_KHR
4972VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004973 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004974 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4975
4976 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4977 assert(my_data != NULL);
4978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004979 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004980
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004981 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004982 result =
4983 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4984 }
4985
4986 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4987
4988 return result;
4989}
4990
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004991VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4992 uint32_t queueFamilyIndex, Display *dpy,
4993 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004994 VkBool32 result = false;
4995
4996 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4997 assert(my_data != NULL);
4998
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004999 bool skip_call =
5000 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005001
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005002 if (!skip_call) {
5003 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5004 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005005 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005006 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005007}
5008#endif // VK_USE_PLATFORM_XLIB_KHR
5009
5010#ifdef VK_USE_PLATFORM_MIR_KHR
5011VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005012 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005013 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5014
5015 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5016 assert(my_data != NULL);
5017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005018 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005019
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005020 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005021 result =
5022 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5023 }
5024
5025 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5026
5027 return result;
5028}
5029
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005030VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5031 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005032 VkBool32 result = false;
5033
5034 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5035 assert(my_data != NULL);
5036
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005037 bool skip_call =
5038 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005039
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005040 if (!skip_call) {
5041 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5042 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005043 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005044}
5045#endif // VK_USE_PLATFORM_MIR_KHR
5046
5047#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5048VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005049 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005050 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5051
5052 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5053 assert(my_data != NULL);
5054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005055 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005056
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005057 if (!skip_call) {
5058 result = get_dispatch_table(pc_instance_table_map, instance)
5059 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005060 }
5061
5062 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5063
5064 return result;
5065}
5066
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005067VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5068 uint32_t queueFamilyIndex,
5069 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005070 VkBool32 result = false;
5071
5072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5073 assert(my_data != NULL);
5074
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005075 bool skip_call =
5076 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005077
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005078 if (!skip_call) {
5079 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5080 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005081 }
5082}
5083#endif // VK_USE_PLATFORM_WAYLAND_KHR
5084
5085#ifdef VK_USE_PLATFORM_ANDROID_KHR
5086VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005087 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005088 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5089
5090 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5091 assert(my_data != NULL);
5092
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005093 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005094
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005095 if (!skip_call) {
5096 result = get_dispatch_table(pc_instance_table_map, instance)
5097 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005098 }
5099
5100 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5101
5102 return result;
5103}
5104#endif // VK_USE_PLATFORM_ANDROID_KHR
5105
Mark Youngead9b932016-09-08 12:28:38 -06005106VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5107 const VkSwapchainCreateInfoKHR *pCreateInfos,
5108 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5109 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5110 bool skip_call = false;
5111 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5112 assert(my_data != NULL);
5113
5114 skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
5115 pSwapchains);
5116
5117 if (!skip_call) {
5118 result = get_dispatch_table(pc_device_table_map, device)
5119 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5120
5121 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5122 }
5123
5124 return result;
5125}
5126
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005127// VK_EXT_debug_marker Extension
5128VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5129 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5130 bool skip_call = false;
5131 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5132 assert(my_data != NULL);
5133
5134 skip_call |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
5135
5136 if (!skip_call) {
5137 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5138
5139 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5140 }
5141
5142 return result;
5143}
5144
5145VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5146 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5147 bool skip_call = false;
5148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5149 assert(my_data != NULL);
5150
5151 skip_call |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
5152
5153 if (!skip_call) {
5154 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5155
5156 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5157 }
5158
5159 return result;
5160}
5161
5162VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(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_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
5168
5169 if (!skip_call) {
5170 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5171 }
5172}
5173
5174VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5175 bool skip_call = false;
5176 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5177 assert(my_data != NULL);
5178
5179 skip_call |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
5180
5181 if (!skip_call) {
5182 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5183 }
5184}
5185
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005186// VK_NV_external_memory_capabilities Extension
5187VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5188 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5189 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5190 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5191
5192 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5193 bool skip_call = false;
5194 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5195 assert(my_data != NULL);
5196
5197 skip_call |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
5198 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5199
5200 if (!skip_call) {
5201 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5202 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5203 externalHandleType, pExternalImageFormatProperties);
5204
5205 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5206 }
5207
5208 return result;
5209}
5210
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005211#ifdef VK_USE_PLATFORM_WIN32_KHR
5212// VK_NV_external_memory_win32 Extension
5213VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5214 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5215
5216 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5217 bool skip_call = false;
5218 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5219 assert(my_data != NULL);
5220
5221 skip_call |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
5222
5223 if (!skip_call) {
5224 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5225 }
5226
5227 return result;
5228}
5229#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005230
5231
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005232
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005233static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005235static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005236
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005237static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005238
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005239static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005240
Chia-I Wu01ca2372016-05-13 14:37:49 +08005241VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005242 assert(device);
5243
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005244 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5245
Dustin Graves080069b2016-04-05 13:48:15 -06005246 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005247 return NULL;
5248 }
5249
Chia-I Wuf9b01382016-05-16 07:37:41 +08005250 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5251 if (proc)
5252 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005253
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005254 proc = InterceptWsiEnabledCommand(funcName, device);
5255 if (proc)
5256 return proc;
5257
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005258 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005259 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005260 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005261}
5262
Chia-I Wu01ca2372016-05-13 14:37:49 +08005263VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005264 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005265 if (!proc)
5266 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005267
5268 if (!proc)
5269 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005270
Chia-I Wu617f2a42016-05-16 07:41:17 +08005271 if (proc)
5272 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005273
Chia-I Wu617f2a42016-05-16 07:41:17 +08005274 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005275
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005276 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005277
Chia-I Wu617f2a42016-05-16 07:41:17 +08005278 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005279 if (!proc)
5280 proc = InterceptWsiEnabledCommand(funcName, instance);
5281
Chia-I Wu617f2a42016-05-16 07:41:17 +08005282 if (proc)
5283 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005284
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005285 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005286 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005287 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005288}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005290static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005291 static const struct {
5292 const char *name;
5293 PFN_vkVoidFunction proc;
5294 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005295 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5296 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5297 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5298 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5299 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5300 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5301 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5302 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5303 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5304 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5305 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5306 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5307 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5308 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5309 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5310 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5311 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005312 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005313 };
5314
5315 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5316 if (!strcmp(core_instance_commands[i].name, name))
5317 return core_instance_commands[i].proc;
5318 }
5319
5320 return nullptr;
5321}
5322
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005323static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005324 static const struct {
5325 const char *name;
5326 PFN_vkVoidFunction proc;
5327 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005328 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5329 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5330 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5331 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5332 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5333 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5334 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5335 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5336 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5337 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5338 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5339 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5340 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5341 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5342 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5343 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5344 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5345 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5346 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5347 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5348 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5349 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5350 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5351 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5352 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5353 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5354 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5355 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5356 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5357 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5358 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5359 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5360 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5361 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5362 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5363 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5364 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5365 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5366 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5367 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5368 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5369 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5370 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5371 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5372 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5373 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5374 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5375 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5376 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5377 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5378 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5379 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5380 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5381 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5382 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5383 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5384 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5385 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5386 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5387 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5388 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5389 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5390 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5391 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5392 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5393 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5394 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5395 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5396 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5397 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5398 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5399 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5400 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5401 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5402 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5403 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5404 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5405 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5406 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5407 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5408 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5409 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5410 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5411 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5412 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5413 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5414 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5415 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5416 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5417 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5418 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5419 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5420 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5421 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5422 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5423 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5424 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5425 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5426 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5427 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5428 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5429 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5430 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5431 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5432 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5433 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5434 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5435 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5436 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5437 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5438 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5439 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5440 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5441 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5442 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5443 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5444 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005445 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5446 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5447 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5448 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005449#ifdef VK_USE_PLATFORM_WIN32_KHR
5450 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5451#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005452};
5453
Chia-I Wuf9b01382016-05-16 07:37:41 +08005454
5455 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5456 if (!strcmp(core_device_commands[i].name, name))
5457 return core_device_commands[i].proc;
5458 }
5459
5460 return nullptr;
5461}
5462
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005463static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005464 static const struct {
5465 const char *name;
5466 PFN_vkVoidFunction proc;
5467 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005468 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5469 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5470 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5471 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005472 };
5473
5474 if (device) {
5475 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005476
Mark Youngead9b932016-09-08 12:28:38 -06005477 if (device_data->wsi_enabled) {
5478 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5479 if (!strcmp(wsi_device_commands[i].name, name))
5480 return wsi_device_commands[i].proc;
5481 }
5482 }
5483
5484 if (device_data->wsi_display_swapchain_enabled) {
5485 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5486 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
5487 }
5488 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005489 }
5490
5491 return nullptr;
5492}
5493
5494static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5495 static const struct {
5496 const char *name;
5497 PFN_vkVoidFunction proc;
5498 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005499 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5500 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5501 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5502 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5503 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5504 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005505 };
5506
5507 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005508 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005509 return nullptr;
5510
5511 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5512 if (!strcmp(wsi_instance_commands[i].name, name))
5513 return wsi_instance_commands[i].proc;
5514 }
5515
5516#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005517 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005518 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5519#endif // VK_USE_PLATFORM_WIN32_KHR
5520#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005521 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005522 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005523 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005524 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5525#endif // VK_USE_PLATFORM_XCB_KHR
5526#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005527 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005528 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005529 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005530 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5531#endif // VK_USE_PLATFORM_XLIB_KHR
5532#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005533 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005534 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005535 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005536 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5537#endif // VK_USE_PLATFORM_MIR_KHR
5538#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005539 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005540 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005541 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5542 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005543 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5544#endif // VK_USE_PLATFORM_WAYLAND_KHR
5545#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005546 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005547 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5548#endif // VK_USE_PLATFORM_ANDROID_KHR
5549
5550 return nullptr;
5551}
5552
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005553} // namespace parameter_validation
5554
5555// vk_layer_logging.h expects these to be defined
5556
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005557VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5558 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5559 const VkAllocationCallbacks *pAllocator,
5560 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005561 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005562}
5563
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005564VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5565 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005566 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005567}
5568
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005569VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5570 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5571 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005572 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005573}
5574
5575// loader-layer interface v0
5576
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005577VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5578 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005579 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005580}
5581
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005582VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5583 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005584 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005585}
5586
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005587VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5588 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005589 // the layer command handles VK_NULL_HANDLE just fine internally
5590 assert(physicalDevice == VK_NULL_HANDLE);
5591 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005592}
5593
5594VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5595 const char *pLayerName, uint32_t *pCount,
5596 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005597 // the layer command handles VK_NULL_HANDLE just fine internally
5598 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005599 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005600}
5601
5602VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005603 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005604}
5605
5606VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005607 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005608}