blob: e19e07c6dc257c7ce873fa113938c86a874a4358 [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
26#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060027#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30
31#include <iostream>
32#include <string>
33#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050034#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060035#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060036#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060038#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070039#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060040#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041#include "vk_enum_validate_helper.h"
42#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060043
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_table.h"
45#include "vk_layer_data.h"
46#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060047#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070048#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060049
Mark Lobodzinski739391a2016-03-17 15:08:18 -060050#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070051
Chia-I Wu1a6b1932016-05-13 14:07:36 +080052namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060053
Cody Northrop55443ef2015-09-28 15:09:32 -060054struct layer_data {
Chia-I Wua570b7c2016-05-16 07:48:14 +080055 VkInstance instance;
56
Jeremy Hayes99a96322015-06-26 12:48:09 -060057 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070058 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060059
Ian Elliotted6b5ac2016-04-28 09:08:13 -060060 // The following are for keeping track of the temporary callbacks that can
61 // be used in vkCreateInstance and vkDestroyInstance:
62 uint32_t num_tmp_callbacks;
63 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
64 VkDebugReportCallbackEXT *tmp_callbacks;
65
Jon Ashburn5484e0c2016-03-08 17:48:44 -070066 // TODO: Split instance/device structs
67 // Device Data
68 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060069 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Mark Lobodzinskia4932512016-06-27 15:13:00 -060070 VkPhysicalDeviceLimits device_limits;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060071 VkPhysicalDeviceFeatures physical_device_features;
72 VkPhysicalDevice physical_device;
Michael Lentinebdf744f2016-01-27 15:43:43 -060073
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060074 bool wsi_enabled;
75
Mark Lobodzinskia4932512016-06-27 15:13:00 -060076 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060077 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060078 physical_device_features{}, physical_device{}, wsi_enabled(false){};
Cody Northrop55443ef2015-09-28 15:09:32 -060079};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060081static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070082static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060083static device_table_map pc_device_table_map;
84static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060085
Jeremy Hayes99a96322015-06-26 12:48:09 -060086// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070087debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060088 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060089 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060090#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060091 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 -060092#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060093 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060094
95 return data->report_data;
96}
97
98// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070099debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600100 dispatch_key key = get_dispatch_key(object);
101 layer_data *data = get_my_data_ptr(key, layer_data_map);
102#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -0600103 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 -0600104#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -0600105 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600106 return data->report_data;
107}
108
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600109static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600110
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600111 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600112}
113
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600114VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
115 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
116 const VkAllocationCallbacks *pAllocator,
117 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700118 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700119 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600120
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700121 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700122 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600123 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600124 }
125
126 return result;
127}
128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600129VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800130 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700131 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700132 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600133
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700134 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700135 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600136}
137
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600138VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
139 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
140 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700141 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
142 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700143}
144
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700145static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600146
Chia-I Wu3384db82016-05-16 07:30:58 +0800147static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600148 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800149};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700150
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700151static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600152 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
154 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
155 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
156 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
157 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 -0700158 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700159 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600160 return false;
161 }
162
163 return true;
164}
165
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
167 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 return "unrecognized enumerator";
169 }
170
171 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600185 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
192 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
195 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600197 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
198 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600200 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
201 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700202 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800203 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600204 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700205 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800206 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600207 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700208 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700209 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
210 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600211
212 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700213 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600214 enumeratorString += string;
215
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600217 enumeratorString += '|';
218 }
219 }
220
221 return enumeratorString;
222}
223
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700224static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
225 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
226 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
227 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
228 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
229 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600230 return false;
231 }
232
233 return true;
234}
235
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700236static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
237 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600238 return "unrecognized enumerator";
239 }
240
241 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700242 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
244 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600246 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600247 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
250 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
253 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600255 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
256 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700257 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800258 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600259 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700260 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600261 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
262 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700263 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800264 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600265 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266
267 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700268 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600269 enumeratorString += string;
270
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600272 enumeratorString += '|';
273 }
274 }
275
276 return enumeratorString;
277}
278
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
280 VkQueueFlagBits allFlags =
281 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
282 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600283 return false;
284 }
285
286 return true;
287}
288
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
290 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600291 return "unrecognized enumerator";
292 }
293
294 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800296 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600297 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700298 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600299 strings.push_back("VK_QUEUE_COMPUTE_BIT");
300 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700301 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800302 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600303 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700304 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
306 }
307
308 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700309 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600310 enumeratorString += string;
311
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600313 enumeratorString += '|';
314 }
315 }
316
317 return enumeratorString;
318}
319
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
321 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
322 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
323 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
324 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600325 return false;
326 }
327
328 return true;
329}
330
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
332 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600333 return "unrecognized enumerator";
334 }
335
336 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600338 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
339 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800341 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600342 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700343 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600344 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
345 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700346 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800347 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600348 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700349 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800350 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600351 }
352
353 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700354 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600355 enumeratorString += string;
356
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 enumeratorString += '|';
359 }
360 }
361
362 return enumeratorString;
363}
364
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700366 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700367 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600368 return false;
369 }
370
371 return true;
372}
373
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700374static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
375 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600376 return "unrecognized enumerator";
377 }
378
379 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700380 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800381 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600382 }
383
384 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700385 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600386 enumeratorString += string;
387
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700388 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600389 enumeratorString += '|';
390 }
391 }
392
393 return enumeratorString;
394}
395
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
397 VkSparseImageFormatFlagBits allFlags =
398 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
399 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
400 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600401 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600402 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600403
404 return true;
405}
406
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
408 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600409 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600410 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411
412 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700413 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800414 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600415 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700416 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800417 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600418 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700419 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800420 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600421 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422
423 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700424 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600425 enumeratorString += string;
426
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 enumeratorString += '|';
429 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600430 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600431
432 return enumeratorString;
433}
434
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700436 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700437 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600438 return false;
439 }
440
441 return true;
442}
443
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700444static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
445 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600446 return "unrecognized enumerator";
447 }
448
449 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700450 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600451 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
452 }
453
454 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700455 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600456 enumeratorString += string;
457
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600459 enumeratorString += '|';
460 }
461 }
462
463 return enumeratorString;
464}
465
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700466static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
467 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
468 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
469 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
470 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
471 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600472 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
473 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
474 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700475 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 return false;
477 }
478
479 return true;
480}
481
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
483 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600484 return "unrecognized enumerator";
485 }
486
487 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_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_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600502 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700504 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600505 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700507 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600508 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700510 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600511 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700512 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700513 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700515 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700516 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600517 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700518 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700519 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600520 }
521
522 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700523 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600524 enumeratorString += string;
525
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600527 enumeratorString += '|';
528 }
529 }
530
531 return enumeratorString;
532}
533
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700534static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
535 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
536 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
537 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600538 return false;
539 }
540
541 return true;
542}
543
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
545 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600546 return "unrecognized enumerator";
547 }
548
549 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600551 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
552 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700553 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600554 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
555 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700556 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600557 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
558 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700559 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600560 strings.push_back("VK_QUERY_RESULT_64_BIT");
561 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600562
563 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700564 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600565 enumeratorString += string;
566
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700567 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600568 enumeratorString += '|';
569 }
570 }
571
572 return enumeratorString;
573}
574
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
576 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
577 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
578 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
579 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
580 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600581 return false;
582 }
583
584 return true;
585}
586
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
588 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600589 return "unrecognized enumerator";
590 }
591
592 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
601 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
604 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
607 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700608 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600610 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700611 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600612 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
613 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700614 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800615 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600616 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700617 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600618 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
619 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620
621 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700622 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600623 enumeratorString += string;
624
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600626 enumeratorString += '|';
627 }
628 }
629
630 return enumeratorString;
631}
632
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700633static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
634 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
635 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
636 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 return false;
638 }
639
640 return true;
641}
642
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
644 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600645 return "unrecognized enumerator";
646 }
647
648 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700649 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600650 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
651 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700652 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600653 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
654 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700655 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600656 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600657 }
658
659 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700660 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600661 enumeratorString += string;
662
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700663 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600664 enumeratorString += '|';
665 }
666 }
667
668 return enumeratorString;
669}
670
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
672 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
673 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
674 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
675 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600676 return false;
677 }
678
679 return true;
680}
681
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
683 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600684 return "unrecognized enumerator";
685 }
686
687 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600689 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
690 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700691 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600692 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
693 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700694 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600695 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
696 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700697 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600698 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
699 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700700 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600701 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600702 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703
704 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700705 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600706 enumeratorString += string;
707
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600709 enumeratorString += '|';
710 }
711 }
712
713 return enumeratorString;
714}
715
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700716static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
717 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
718 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
719 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 return false;
721 }
722
723 return true;
724}
725
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
727 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600728 return "unrecognized enumerator";
729 }
730
731 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700732 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800733 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600734 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700735 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800736 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600737 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700738 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800739 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600740 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700741 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800742 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600743 }
744
745 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700746 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600747 enumeratorString += string;
748
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600750 enumeratorString += '|';
751 }
752 }
753
754 return enumeratorString;
755}
756
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700757static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
758 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
759 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
760 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600761 return false;
762 }
763
764 return true;
765}
766
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700767static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
768 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600769 return "unrecognized enumerator";
770 }
771
772 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700773 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600774 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
775 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600777 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
778 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700779 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600780 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600781 }
782
783 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700784 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600785 enumeratorString += string;
786
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700787 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600788 enumeratorString += '|';
789 }
790 }
791
792 return enumeratorString;
793}
794
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
796 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
797 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
798 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
799 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600800 return false;
801 }
802
803 return true;
804}
805
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
807 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600808 return "unrecognized enumerator";
809 }
810
811 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600814 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600816 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600817 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600819 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
820 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600822 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
823 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700824 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600825 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600826 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700827 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600828 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600829 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700830 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600831 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600832 }
833
834 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700835 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600836 enumeratorString += string;
837
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600839 enumeratorString += '|';
840 }
841 }
842
843 return enumeratorString;
844}
845
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700846static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800847 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
849 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
850 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
851 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
852 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
853 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 -0700854 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700855 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 return false;
857 }
858
859 return true;
860}
861
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
863 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600864 return "unrecognized enumerator";
865 }
866
867 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800869 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800872 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600875 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600881 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700884 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600887 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600893 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600896 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600899 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
900 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600902 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
903 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700905 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600906 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700907 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600908 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
909 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700910 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600911 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
912 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700913 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600914 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
915 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700916 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600917 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600918 }
919
920 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700921 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600922 enumeratorString += string;
923
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600925 enumeratorString += '|';
926 }
927 }
928
929 return enumeratorString;
930}
931
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700932static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800933 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700934 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
935 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
936 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
937 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
938 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 +0800939
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700940 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600941 return false;
942 }
943
944 return true;
945}
946
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700947static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
948 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600949 return "unrecognized enumerator";
950 }
951
952 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600985 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800987 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600988 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800990 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600991 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700992 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800993 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600994 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700995 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800996 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600997 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700998 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800999 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001000 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001001 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001002 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001003 }
1004
1005 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001006 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001007 enumeratorString += string;
1008
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001010 enumeratorString += '|';
1011 }
1012 }
1013
1014 return enumeratorString;
1015}
1016
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1018 VkCommandPoolCreateFlagBits allFlags =
1019 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1020 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001021 return false;
1022 }
1023
1024 return true;
1025}
1026
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001027static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1028 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001029 return "unrecognized enumerator";
1030 }
1031
1032 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001033 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001034 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001035 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001036 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001037 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001038 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039
1040 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001041 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001042 enumeratorString += string;
1043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045 enumeratorString += '|';
1046 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001047 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001048
1049 return enumeratorString;
1050}
1051
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001053 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001054 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001055 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001056 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001057
1058 return true;
1059}
1060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001061static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1062 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001063 return "unrecognized enumerator";
1064 }
1065
1066 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001067 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001068 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001069 }
1070
1071 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001072 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001073 enumeratorString += string;
1074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001075 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001076 enumeratorString += '|';
1077 }
1078 }
1079
1080 return enumeratorString;
1081}
1082
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1084 VkCommandBufferUsageFlags allFlags =
1085 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1086 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1087 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 return false;
1089 }
1090
1091 return true;
1092}
1093
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1095 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001096 return "unrecognized enumerator";
1097 }
1098
1099 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001100 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001101 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001102 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001103 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001104 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001105 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001106 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001107 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001108 }
1109
1110 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001111 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001112 enumeratorString += string;
1113
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 enumeratorString += '|';
1116 }
1117 }
1118
1119 return enumeratorString;
1120}
1121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001123 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001124 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001125 return false;
1126 }
1127
1128 return true;
1129}
1130
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001131static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1132 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001133 return "unrecognized enumerator";
1134 }
1135
1136 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001137 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001138 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001139 }
1140
1141 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001142 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001143 enumeratorString += string;
1144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001146 enumeratorString += '|';
1147 }
1148 }
1149
1150 return enumeratorString;
1151}
1152
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001153static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1154 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1155 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1156 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001157 return false;
1158 }
1159
1160 return true;
1161}
1162
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1164 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001165 return "unrecognized enumerator";
1166 }
1167
1168 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001169 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001172 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001173 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001175 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001176 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001178 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001179 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1180 }
1181
1182 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001183 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001184 enumeratorString += string;
1185
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001187 enumeratorString += '|';
1188 }
1189 }
1190
1191 return enumeratorString;
1192}
1193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001195 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001196 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001197 return false;
1198 }
1199
1200 return true;
1201}
1202
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001203static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1204 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001205 return "unrecognized enumerator";
1206 }
1207
1208 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001209 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001210 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001211 }
1212
1213 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001214 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001215 enumeratorString += string;
1216
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001217 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001218 enumeratorString += '|';
1219 }
1220 }
1221
1222 return enumeratorString;
1223}
1224
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001225static const int MaxParamCheckerStringLength = 256;
1226
Dustin Graves080069b2016-04-05 13:48:15 -06001227static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1228 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001229 assert(apiName != nullptr);
1230 assert(stringName != nullptr);
1231 assert(validateString != nullptr);
1232
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001233 bool skip_call = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001234
1235 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1236
1237 if (result == VK_STRING_ERROR_NONE) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001238 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001239 } else if (result & VK_STRING_ERROR_LENGTH) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001240 skip_call =
Dustin Gravesf233e502016-05-05 13:44:21 -06001241 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001242 LayerName, "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001243 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001244 skip_call =
Dustin Gravesf233e502016-05-05 13:44:21 -06001245 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001246 LayerName, "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001247 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001248 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001249}
1250
Dustin Gravesde628532016-04-21 16:30:17 -06001251static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1252 uint32_t index) {
1253 assert(device_data != nullptr);
1254 debug_report_data *report_data = device_data->report_data;
1255 bool skip_call = false;
1256
1257 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001258 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1259 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001260 } else {
1261 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1262 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1263 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001264 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1265 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001266 function_name, parameter_name, index);
1267 return false;
1268 }
1269 }
1270
1271 return skip_call;
1272}
1273
1274static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1275 const uint32_t count, const uint32_t *indices) {
1276 assert(device_data != nullptr);
1277 debug_report_data *report_data = device_data->report_data;
1278 bool skip_call = false;
1279
1280 if (indices != nullptr) {
1281 for (uint32_t i = 0; i < count; i++) {
1282 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001283 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1284 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001285 } else {
1286 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1287 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1288 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001289 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1290 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001291 function_name, parameter_name, i, indices[i]);
1292 return false;
1293 }
1294 }
1295 }
1296 }
1297
1298 return skip_call;
1299}
1300
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001301VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1302 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001303 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001304
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001305 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001306 assert(chain_info != nullptr);
1307 assert(chain_info->u.pLayerInfo != nullptr);
1308
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001309 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1310 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001311 if (fpCreateInstance == NULL) {
1312 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001313 }
1314
Dustin Graves842621d2016-03-03 14:17:08 -07001315 // Advance the link info for the next element on the chain
1316 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1317
1318 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001319
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001320 if (result == VK_SUCCESS) {
1321 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1322 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001323
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001324 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001325
Chia-I Wua570b7c2016-05-16 07:48:14 +08001326 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001327 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1328 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001329
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001330 // Look for one or more debug report create info structures
1331 // and setup a callback(s) for each one found.
1332 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1333 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1334 if (my_instance_data->num_tmp_callbacks > 0) {
1335 // Setup the temporary callback(s) here to catch early issues:
1336 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1337 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1338 // Failure of setting up one or more of the callback.
1339 // Therefore, clean up and don't use those callbacks:
1340 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1341 my_instance_data->num_tmp_callbacks = 0;
1342 }
1343 }
1344 }
1345
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001346 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001347
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001348 // Ordinarily we'd check these before calling down the chain, but none of the layer
1349 // support is in place until now, if we survive we can report the issue now.
1350 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001351
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001352 if (pCreateInfo->pApplicationInfo) {
1353 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1354 validate_string(my_instance_data->report_data, "vkCreateInstance",
1355 "pCreateInfo->VkApplicationInfo->pApplicationName",
1356 pCreateInfo->pApplicationInfo->pApplicationName);
1357 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001358
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001359 if (pCreateInfo->pApplicationInfo->pEngineName) {
1360 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1361 pCreateInfo->pApplicationInfo->pEngineName);
1362 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001363 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001364
1365 // Disable the tmp callbacks:
1366 if (my_instance_data->num_tmp_callbacks > 0) {
1367 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1368 my_instance_data->tmp_callbacks);
1369 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001370 }
1371
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001372 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001373}
1374
Chia-I Wu01ca2372016-05-13 14:37:49 +08001375VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001376 // Grab the key before the instance is destroyed.
1377 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001378 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001379 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001380 assert(my_data != NULL);
1381
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001382 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1383 bool callback_setup = false;
1384 if (my_data->num_tmp_callbacks > 0) {
1385 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1386 my_data->tmp_callbacks)) {
1387 callback_setup = true;
1388 }
1389 }
1390
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001391 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001392
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001393 // Disable and cleanup the temporary callback(s):
1394 if (callback_setup) {
1395 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1396 }
1397 if (my_data->num_tmp_callbacks > 0) {
1398 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1399 my_data->num_tmp_callbacks = 0;
1400 }
1401
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001402 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001403 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001404 pTable->DestroyInstance(instance, pAllocator);
1405
1406 // Clean up logging callback, if any
1407 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1409 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001410 my_data->logging_callback.pop_back();
1411 }
1412
1413 layer_debug_report_destroy_instance(mid(instance));
1414 layer_data_map.erase(pTable);
1415
1416 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001417 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001418 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001419}
1420
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001421VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1422 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001423 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001424 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001426 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001428 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001430 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001431 result = get_dispatch_table(pc_instance_table_map, instance)
1432 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001434 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001435 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1436 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1437 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1438 // Save the supported features for each physical device
1439 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1440 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1441 }
1442 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001443 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001444 return result;
1445}
1446
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001447VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1448 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001449 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001452 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001454 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001455 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001456 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001457}
1458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001459VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1460 VkFormatProperties *pFormatProperties) {
1461 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001462 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001463 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001465 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001466
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001467 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001468 get_dispatch_table(pc_instance_table_map, physicalDevice)
1469 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001470 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001471}
1472
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001473VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1474 VkImageType type, VkImageTiling tiling,
1475 VkImageUsageFlags usage, VkImageCreateFlags flags,
1476 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001477 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001478 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001479 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001480 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001482 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1483 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001485 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001486 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1487 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1488 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001490 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001491 }
Chia-I Wu17241042015-10-31 00:31:16 +08001492
1493 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001494}
1495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001496VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1497 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001498 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001499 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001501 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001503 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001505 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001506}
1507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001508VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1509 uint32_t *pQueueFamilyPropertyCount,
1510 VkQueueFamilyProperties *pQueueFamilyProperties) {
1511 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001514
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001515 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1516 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001517
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001518 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001519 get_dispatch_table(pc_instance_table_map, physicalDevice)
1520 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001521 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001522}
1523
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001524VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1525 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1526 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001527 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001528 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001529
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001530 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001531
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001532 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001533 get_dispatch_table(pc_instance_table_map, physicalDevice)
1534 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001535 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001536}
1537
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001538void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1539 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001540 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001541
1542 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1543 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1544 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001545 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 -06001546 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001547 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1548 "structure.",
1549 i);
1550 } else {
1551 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001552 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001553
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001554 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1555 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1556 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1557 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001558 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 -06001559 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001560 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1561 "between 0 and 1. Actual value is %f",
1562 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1563 }
1564 }
1565 }
1566
1567 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1568 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001569 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001570 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001571 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1572 "of queue families.",
1573 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001574 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1575 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1576 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001577 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001578 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001579 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1580 "queues for the given family index.",
1581 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001582 }
Michael Lentine774704f2016-01-27 13:36:46 -06001583 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001584 }
1585}
1586
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001587static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001588 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001590 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001591
1592 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1593 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001594 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001595 }
1596#ifdef VK_USE_PLATFORM_XLIB_KHR
1597 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001598 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001599 }
1600#endif
1601#ifdef VK_USE_PLATFORM_XCB_KHR
1602 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001603 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001604 }
1605#endif
1606#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1607 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001608 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001609 }
1610#endif
1611#ifdef VK_USE_PLATFORM_MIR_KHR
1612 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001613 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001614 }
1615#endif
1616#ifdef VK_USE_PLATFORM_ANDROID_KHR
1617 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001618 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001619 }
1620#endif
1621#ifdef VK_USE_PLATFORM_WIN32_KHR
1622 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001623 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001624 }
1625#endif
1626 }
1627}
1628
1629static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1630 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1631 device_data->wsi_enabled = false;
1632
1633 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1634 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1635 device_data->wsi_enabled = true;
1636 }
1637 }
1638}
1639
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001640void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001641 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001642
1643 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1644 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1645 my_device_data->queueFamilyIndexMap.insert(
1646 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1647 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001648 }
1649}
1650
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001651VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001652 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001653 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001654 * NOTE: We do not validate physicalDevice or any dispatchable
1655 * object as the first parameter. We couldn't get here if it was wrong!
1656 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001657
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001658 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001659 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001660 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001661 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001662
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001663 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001664
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001665 if (pCreateInfo != NULL) {
1666 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001667 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001668 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1669 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001670 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001671 }
Michael Lentine774704f2016-01-27 13:36:46 -06001672
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001673 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001674 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001675 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1676 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001677 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001678 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001679 }
1680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001681 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001682 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001683 assert(chain_info != nullptr);
1684 assert(chain_info->u.pLayerInfo != nullptr);
1685
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001686 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1687 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001688 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001689 if (fpCreateDevice == NULL) {
1690 return VK_ERROR_INITIALIZATION_FAILED;
1691 }
1692
1693 // Advance the link info for the next element on the chain
1694 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1695
1696 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001697
1698 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1699
1700 if (result == VK_SUCCESS) {
1701 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1702 assert(my_device_data != nullptr);
1703
1704 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1705 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1706
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001707 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1708
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001709 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001710 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1711 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001712 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001713 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001714
1715 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1716 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001717
1718 // Query and save physical device limits for this device
1719 VkPhysicalDeviceProperties device_properties = {};
1720 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1721 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001722 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001723
1724 // Save app-enabled features in this device's layer_data structure
1725 if (pCreateInfo->pEnabledFeatures) {
1726 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1727 } else {
1728 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1729 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001730 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001731 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001732
Jeremy Hayes99a96322015-06-26 12:48:09 -06001733 return result;
1734}
1735
Chia-I Wu01ca2372016-05-13 14:37:49 +08001736VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001737 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001738 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001739 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1740 assert(my_data != NULL);
1741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001742 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001743
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001744 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001745 layer_debug_report_destroy_device(device);
1746
Jeremy Hayes99a96322015-06-26 12:48:09 -06001747#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001748 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001749#endif
1750
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001751 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001752 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001753 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001754 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001755}
1756
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001757bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001758 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001759 assert(my_device_data != nullptr);
1760
Dustin Gravesde628532016-04-21 16:30:17 -06001761 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001762
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001763 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001764 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001765 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 -06001766 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001767 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1768 "was created.",
1769 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001770 return false;
1771 }
1772 return true;
1773}
1774
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001775VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1776 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001777 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001778 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001779
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001780 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001782 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001783 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1784
1785 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001787}
1788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001789VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001790 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001791 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001792 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001793 assert(my_data != NULL);
1794
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001795 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001796
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001797 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001798 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1799
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001800 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001801 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001802
Jeremy Hayes99a96322015-06-26 12:48:09 -06001803 return result;
1804}
1805
Chia-I Wu01ca2372016-05-13 14:37:49 +08001806VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001807 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1808 assert(my_data != NULL);
1809
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001810 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001811
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001812 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001813
1814 return result;
1815}
1816
Chia-I Wu01ca2372016-05-13 14:37:49 +08001817VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001818 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1819 assert(my_data != NULL);
1820
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001821 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001822
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001823 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001824
1825 return result;
1826}
1827
Chia-I Wu01ca2372016-05-13 14:37:49 +08001828VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001829 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001830 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001831 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001832 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001833 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001834
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001835 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001836
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001837 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001838 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1839
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001840 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001841 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001842
1843 return result;
1844}
1845
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001846VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1847 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001848 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001849 assert(my_data != NULL);
1850
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001851 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001852
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001853 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001854 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001855 }
1856}
1857
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001858VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1859 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001860 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001861 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001862 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001863 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001864
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001865 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001867 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001868 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1869
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001870 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001871 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001872
1873 return result;
1874}
1875
Chia-I Wu01ca2372016-05-13 14:37:49 +08001876VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001877 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001878 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1879 assert(my_data != NULL);
1880
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001881 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001882
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001883 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001884 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1885 }
1886}
1887
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001888VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1889 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001890 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001891 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001892 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001893 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001894
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001895 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001896
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001897 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001898 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1899
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001900 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001901 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001902
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001903 return result;
1904}
1905
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001906VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1907 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001908 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001909 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001910 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001912
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001913 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001914
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001915 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001916 result =
1917 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001918
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001919 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001921
Tony Barbourb1250542015-04-16 19:23:13 -06001922 return result;
1923}
1924
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001925VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1926 VkDeviceSize *pCommittedMemoryInBytes) {
1927 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001928 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001929 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001930
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001931 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001932
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001933 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001934 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001935 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001936}
1937
Chia-I Wu01ca2372016-05-13 14:37:49 +08001938VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1939 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001940 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001941 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001942 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1943 assert(my_data != NULL);
1944
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001945 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001947 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001948 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1949
1950 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1951 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001952
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001953 return result;
1954}
1955
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001956VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001957 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001958 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001959 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1960 assert(my_data != NULL);
1961
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001962 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001963
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001964 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001965 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1966
1967 validate_result(my_data->report_data, "vkBindImageMemory", result);
1968 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001969
1970 return result;
1971}
1972
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001973VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1974 VkMemoryRequirements *pMemoryRequirements) {
1975 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001976 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001977 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001979 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001980
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001981 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001983 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001984}
1985
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001986VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1987 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001988 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001989 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001990
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001991 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001992
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001993 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001994 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001995 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001996}
1997
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001998bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1999 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2000 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002001 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002002 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2003 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002004 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 -06002005 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2007 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002008 return false;
2009 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002010 }
2011
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002012 return true;
2013}
2014
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002015VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2016 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2017 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002018 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002021 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2022 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002023
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002024 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002025 get_dispatch_table(pc_device_table_map, device)
2026 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002027
2028 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2029 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002030}
2031
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002032bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2033 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2034 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002035 if (pProperties != nullptr) {
2036 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2037 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002038 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 -06002039 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002040 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2041 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002042 return false;
2043 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002044 }
2045
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002046 return true;
2047}
2048
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002049VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2050 VkImageType type, VkSampleCountFlagBits samples,
2051 VkImageUsageFlags usage, VkImageTiling tiling,
2052 uint32_t *pPropertyCount,
2053 VkSparseImageFormatProperties *pProperties) {
2054 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002055 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002057
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002058 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2059 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002061 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002062 get_dispatch_table(pc_instance_table_map, physicalDevice)
2063 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2064 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002065
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002066 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2067 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002068 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002069}
2070
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002071VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2072 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002073 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002074 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002075 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002076 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002077
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002078 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002080 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002081 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2082
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002083 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002084 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002085
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002086 return result;
2087}
2088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002089VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2090 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002091 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002092 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002093 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002094 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002095
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002096 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002097
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002098 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002099 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2100
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002101 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002102 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002103
2104 return result;
2105}
2106
Chia-I Wu01ca2372016-05-13 14:37:49 +08002107VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002108 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002109 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002110 assert(my_data != NULL);
2111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002112 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002113
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002114 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002115 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002116 }
2117}
2118
Chia-I Wu01ca2372016-05-13 14:37:49 +08002119VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002120 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002121 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002122 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002123 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002124
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002125 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002126
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002127 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002128 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2129
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002130 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002131 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002132
2133 return result;
2134}
2135
Chia-I Wu01ca2372016-05-13 14:37:49 +08002136VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002137 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002138 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002139 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2140 assert(my_data != NULL);
2141
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002142 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002143
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002144 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002145 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2146
2147 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2148 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002149
2150 return result;
2151}
2152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002153VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2154 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002155 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002156 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002158 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002160 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002161
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002162 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002163 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2164
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002165 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002166 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002167
2168 return result;
2169}
2170
Chia-I Wu01ca2372016-05-13 14:37:49 +08002171VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002172 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002173 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002174 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002175 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002176 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002177
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002178 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002179
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002180 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002181 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2182
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002183 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002184 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002185
2186 return result;
2187}
2188
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002189VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2190 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002191 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002192 assert(my_data != NULL);
2193
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002194 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002195
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002196 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002197 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002198 }
2199}
2200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002201VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2202 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002203 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002204 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002205 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002206 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002207
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002208 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002209
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002210 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002211 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2212
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002213 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002214 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002215
2216 return result;
2217}
2218
Chia-I Wu01ca2372016-05-13 14:37:49 +08002219VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002220 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002221 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002222 assert(my_data != NULL);
2223
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002224 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002225
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002226 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002227 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002228 }
2229}
2230
Chia-I Wu01ca2372016-05-13 14:37:49 +08002231VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002232 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002233 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002234 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2235 assert(my_data != NULL);
2236
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002237 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002238
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002239 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002240 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2241
2242 validate_result(my_data->report_data, "vkGetEventStatus", result);
2243 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002244
2245 return result;
2246}
2247
Chia-I Wu01ca2372016-05-13 14:37:49 +08002248VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002249 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002250 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002251 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2252 assert(my_data != NULL);
2253
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002254 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002255
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002256 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002257 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2258
2259 validate_result(my_data->report_data, "vkSetEvent", result);
2260 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002261
2262 return result;
2263}
2264
Chia-I Wu01ca2372016-05-13 14:37:49 +08002265VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002266 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002267 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002268 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2269 assert(my_data != NULL);
2270
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002271 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002272
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002273 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002274 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2275
2276 validate_result(my_data->report_data, "vkResetEvent", result);
2277 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002278
2279 return result;
2280}
2281
Chia-I Wu01ca2372016-05-13 14:37:49 +08002282VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002283 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002284 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002285 bool skip_call = false;
2286 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2287 assert(device_data != nullptr);
2288 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002289
Dustin Gravesc900f572016-05-16 11:07:59 -06002290 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002291
Dustin Gravesc900f572016-05-16 11:07:59 -06002292 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2293 if (pCreateInfo != nullptr) {
2294 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2295 // VkQueryPipelineStatisticFlagBits values
2296 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2297 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2298 skip_call |=
2299 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2300 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2301 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2302 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2303 }
2304 }
2305
2306 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002307 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2308
Dustin Gravesc900f572016-05-16 11:07:59 -06002309 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002310 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002311
2312 return result;
2313}
2314
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002315VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2316 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002317 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002318 assert(my_data != NULL);
2319
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002320 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002321
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002322 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002323 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002324 }
2325}
2326
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002327VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2328 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002329 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002330 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002331 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002332 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002333
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002334 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2335 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002336
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002337 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002338 result = get_dispatch_table(pc_device_table_map, device)
2339 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002340
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002341 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002342 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002343
2344 return result;
2345}
2346
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002347VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2348 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002349 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002350 bool skip_call = false;
2351 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2352 assert(device_data != nullptr);
2353 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002354
Dustin Gravesc900f572016-05-16 11:07:59 -06002355 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002356
Dustin Gravesc900f572016-05-16 11:07:59 -06002357 if (pCreateInfo != nullptr) {
2358 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2359 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2360 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2361 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2362 skip_call |=
2363 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2364 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2365 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2366 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002367
Dustin Gravesc900f572016-05-16 11:07:59 -06002368 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2369 // queueFamilyIndexCount uint32_t values
2370 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2371 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2372 __LINE__, REQUIRED_PARAMETER, LayerName,
2373 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2374 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2375 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2376 }
2377
2378 // Ensure that the queue family indices were specified at device creation
2379 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2380 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2381 }
2382 }
2383
2384 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002385 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2386
Dustin Gravesc900f572016-05-16 11:07:59 -06002387 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002388 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002389
2390 return result;
2391}
2392
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002393VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2394 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002395 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002396 assert(my_data != NULL);
2397
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002398 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002399
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002400 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002401 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002402 }
2403}
2404
Chia-I Wu01ca2372016-05-13 14:37:49 +08002405VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2406 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002407 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002408 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002409 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002410 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002411
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002412 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002413
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002414 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002415 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2416
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002417 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002418 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002419
2420 return result;
2421}
2422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002423VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2424 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002426 assert(my_data != NULL);
2427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002428 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002430 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002431 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002432 }
2433}
2434
Chia-I Wu01ca2372016-05-13 14:37:49 +08002435VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2436 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002437 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2438 bool skip_call = false;
2439 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002440 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002441 debug_report_data *report_data = device_data->report_data;
2442
2443 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2444
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002445 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002446 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002447 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002448 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2449 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2450 skip_call |=
2451 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2452 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2453 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2454 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002455
Dustin Gravesc900f572016-05-16 11:07:59 -06002456 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2457 // queueFamilyIndexCount uint32_t values
2458 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2459 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2460 __LINE__, REQUIRED_PARAMETER, LayerName,
2461 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2462 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2463 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2464 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002465
2466 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2467 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2468 }
2469
2470 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002471 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2472 skip_call |=
2473 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2474 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002475
2476 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002477 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478
2479 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002480 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002481
2482 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2483 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2484 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2485 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002486 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487 }
2488
2489 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2490 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2491 // extent.height must be equal
2492 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2493 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002494 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2495 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2496 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2497 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002498 }
2499
2500 if (pCreateInfo->extent.depth != 1) {
2501 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002502 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002503 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2504 }
2505 }
2506
2507 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2508 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2509 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002510 skip_call |=
2511 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2512 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2513 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002514 }
2515
2516 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2517 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2518 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2519 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002520 skip_call |=
2521 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2522 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2523 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002524 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002526
Dustin Gravesf8032f22016-05-11 18:31:44 -06002527 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002528 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2529
Dustin Gravesf8032f22016-05-11 18:31:44 -06002530 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002531 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002532
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002533 return result;
2534}
2535
Chia-I Wu01ca2372016-05-13 14:37:49 +08002536VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002537 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002539 assert(my_data != NULL);
2540
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002541 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002542
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002543 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002544 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002545 }
2546}
2547
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002548bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2549 if (pSubresource != nullptr) {
2550 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2551 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002552 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 -06002553 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002554 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2555 return false;
2556 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002557 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002558
2559 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002560}
2561
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002562VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2563 VkSubresourceLayout *pLayout) {
2564 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002565 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002566 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002567
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002568 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002569
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002570 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002571 PreGetImageSubresourceLayout(device, pSubresource);
2572
2573 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002574 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002575}
2576
Chia-I Wu01ca2372016-05-13 14:37:49 +08002577VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2578 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002579 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002580 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002581 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002582 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002583 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002584
Dustin Graves0b70a632016-04-27 17:44:56 -06002585 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002586
Dustin Graves0b70a632016-04-27 17:44:56 -06002587 if (pCreateInfo != nullptr) {
2588 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002589 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2590 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002591 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2592 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2593 "pCreateInfo->subresourceRange.layerCount must be 1",
2594 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2595 }
2596 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002597 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2598 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2599 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002600 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2601 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2602 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2603 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2604 }
2605 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002606 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2607 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002608 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2609 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2610 "pCreateInfo->subresourceRange.layerCount must be 6");
2611 }
2612 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002613 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2614 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002615 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2616 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2617 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2618 }
2619 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2620 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2621 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2622 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2623 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2624 }
2625
Dustin Graves2a80dc62016-07-12 13:57:02 -06002626 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2627 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002628 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2629 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2630 "pCreateInfo->subresourceRange.layerCount must be 1");
2631 }
2632 }
2633 }
2634
2635 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002636 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2637
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002638 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002639 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002640
2641 return result;
2642}
2643
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002644VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2645 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002646 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002647 assert(my_data != NULL);
2648
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002649 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002650
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002651 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002652 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002653 }
2654}
2655
Chia-I Wu01ca2372016-05-13 14:37:49 +08002656VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002657 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002658 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002659 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002660 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002661 assert(my_data != NULL);
2662
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002663 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002664
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002665 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002666 result =
2667 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002668
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002669 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002670 }
2671
Michael Lentine03d8e572015-09-15 14:59:14 -05002672 return result;
2673}
2674
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002675VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2676 const VkAllocationCallbacks *pAllocator) {
2677 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002679 assert(my_data != NULL);
2680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002681 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002682
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002683 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002685 }
2686}
2687
Chia-I Wu01ca2372016-05-13 14:37:49 +08002688VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002689 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002690 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002691 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002692 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002693 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002694
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002695 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002697 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002698 result =
2699 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002700
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002701 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002702 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002703
2704 return result;
2705}
2706
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002707VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2708 const VkAllocationCallbacks *pAllocator) {
2709 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002710 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002711 assert(my_data != NULL);
2712
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002713 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002714
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002715 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002716 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002717 }
2718}
2719
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002720VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2721 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002722 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002723 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002725 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002726
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002727 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002729 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002730 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2731
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002732 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002733 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002734
2735 return result;
2736}
2737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002738VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2739 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002740 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002741 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002742 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002743 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002744
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002745 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002747 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002748 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2749
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002750 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002751 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002752
2753 return result;
2754}
2755
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002756bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002757 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2758
2759 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002760 if (pCreateInfos != nullptr) {
2761 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2762 if (pCreateInfos->basePipelineIndex != -1) {
2763 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002764 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 -06002765 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002766 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2767 "pCreateInfos->flags "
2768 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2769 return false;
2770 }
2771 }
2772
2773 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2774 if (pCreateInfos->basePipelineIndex != -1) {
2775 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002776 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002777 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002778 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2779 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2780 "VK_NULL_HANDLE");
2781 return false;
2782 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002783 }
2784 }
2785
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002786 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002787 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002788 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 -06002789 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002790 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2791 "unrecognized enumerator");
2792 return false;
2793 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002794 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002795
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002796 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002797 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002798 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002799 pCreateInfos[i].pStages[j].pName);
2800 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002801 }
2802
2803 return true;
2804}
2805
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002806VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2807 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2808 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002810 bool skip_call = false;
2811 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2812 assert(device_data != nullptr);
2813 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002814
Dustin Gravesc900f572016-05-16 11:07:59 -06002815 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2816 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002817
Dustin Gravesc900f572016-05-16 11:07:59 -06002818 if (pCreateInfos != nullptr) {
2819 for (uint32_t i = 0; i < createInfoCount; ++i) {
2820 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2821 if (pCreateInfos[i].pTessellationState == nullptr) {
2822 if (pCreateInfos[i].pStages != nullptr) {
2823 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2824 // pTessellationState must not be NULL
2825 bool has_control = false;
2826 bool has_eval = false;
2827
2828 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2829 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2830 has_control = true;
2831 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2832 has_eval = true;
2833 }
2834 }
2835
2836 if (has_control && has_eval) {
2837 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2838 __LINE__, REQUIRED_PARAMETER, LayerName,
2839 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2840 "control shader stage and a tessellation evaluation shader stage, "
2841 "pCreateInfos[%d].pTessellationState must not be NULL",
2842 i, i);
2843 }
2844 }
Dustin Graves629259b2016-05-30 16:14:27 -06002845 } else {
2846 skip_call |=
2847 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002848 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002849
2850 skip_call |=
2851 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2852 pCreateInfos[i].pTessellationState->flags);
2853
2854 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2855 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2856 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2857 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2858 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2859 i);
2860 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002861 }
2862
2863 if (pCreateInfos[i].pViewportState == nullptr) {
2864 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2865 // valid VkPipelineViewportStateCreateInfo structure
2866 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2867 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2868 skip_call |= log_msg(
2869 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2870 REQUIRED_PARAMETER, LayerName,
2871 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2872 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2873 i, i);
2874 }
2875 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002876 skip_call |=
2877 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002878 pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002879
2880 skip_call |=
2881 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2882 pCreateInfos[i].pViewportState->flags);
2883
Dustin Gravesc900f572016-05-16 11:07:59 -06002884 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2885 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2886 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2887 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2888 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2889 i);
2890 }
2891
2892 if (pCreateInfos[i].pDynamicState != nullptr) {
2893 bool has_dynamic_viewport = false;
2894 bool has_dynamic_scissor = false;
2895
2896 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2897 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2898 has_dynamic_viewport = true;
2899 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2900 has_dynamic_scissor = true;
2901 }
2902 }
2903
2904 // viewportCount must be greater than 0
2905 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2906 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2907 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2908 __LINE__, REQUIRED_PARAMETER, LayerName,
2909 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2910 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2911 "must be greater than 0",
2912 i, i);
2913 }
2914
2915 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2916 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2917 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2918 skip_call |=
2919 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2920 __LINE__, REQUIRED_PARAMETER, LayerName,
2921 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2922 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2923 i, i);
2924 }
2925
2926 // scissorCount must be greater than 0
2927 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2928 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2929 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2930 __LINE__, REQUIRED_PARAMETER, LayerName,
2931 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2932 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2933 "must be greater than 0",
2934 i, i);
2935 }
2936
2937 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2938 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2939 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2940 skip_call |=
2941 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2942 __LINE__, REQUIRED_PARAMETER, LayerName,
2943 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2944 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2945 i, i);
2946 }
2947 }
2948 }
2949
2950 if (pCreateInfos[i].pMultisampleState == nullptr) {
2951 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2952 // a valid VkPipelineMultisampleStateCreateInfo structure
2953 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2954 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2955 skip_call |=
2956 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2957 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2958 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2959 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2960 i, i);
2961 }
Dustin Graves629259b2016-05-30 16:14:27 -06002962 } else {
2963 skip_call |=
2964 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002965 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002966
2967 skip_call |=
2968 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2969 pCreateInfos[i].pMultisampleState->flags);
2970
2971 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2972 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2973 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2974
2975 skip_call |= validate_array(
2976 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2977 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2978 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2979
2980 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2981 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2982 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2983
2984 skip_call |=
2985 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2986 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
2987
2988 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2989 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2990 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2991 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2992 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2993 i);
2994 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002995 }
2996
2997 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06002998 if (pCreateInfos[i].pDepthStencilState != nullptr) {
2999 skip_call |=
3000 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003001 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003002
3003 skip_call |=
3004 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
3005 pCreateInfos[i].pDepthStencilState->flags);
3006
3007 skip_call |=
3008 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
3009 pCreateInfos[i].pDepthStencilState->depthTestEnable);
3010
3011 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3012 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
3013 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
3014
3015 skip_call |= validate_ranged_enum(
3016 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
3017 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
3018
3019 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3020 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
3021 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
3022
3023 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3024 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
3025 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
3026
3027 skip_call |= validate_ranged_enum(
3028 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
3029 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
3030
3031 skip_call |= validate_ranged_enum(
3032 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
3033 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
3034
3035 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3036 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
3037 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3038 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
3039
3040 skip_call |= validate_ranged_enum(
3041 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
3042 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
3043
3044 skip_call |= validate_ranged_enum(
3045 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
3046 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3047
3048 skip_call |= validate_ranged_enum(
3049 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
3050 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3051
3052 skip_call |= validate_ranged_enum(
3053 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
3054 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3055
3056 skip_call |= validate_ranged_enum(
3057 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3058 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3059
3060 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3061 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3062 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3063 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3064 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3065 i);
3066 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003067 }
3068
3069 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3070 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003071 skip_call |=
3072 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003073 pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003074
3075 skip_call |=
3076 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3077 pCreateInfos[i].pColorBlendState->flags);
3078
3079 skip_call |=
3080 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3081 pCreateInfos[i].pColorBlendState->logicOpEnable);
3082
3083 skip_call |= validate_array(
3084 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3085 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3086 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3087
3088 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3089 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3090 ++attachmentIndex) {
3091 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3092 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3093 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3094
3095 skip_call |= validate_ranged_enum(
3096 report_data, "vkCreateGraphicsPipelines",
3097 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3098 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3099 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3100
3101 skip_call |= validate_ranged_enum(
3102 report_data, "vkCreateGraphicsPipelines",
3103 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3104 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3105 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3106
3107 skip_call |= validate_ranged_enum(
3108 report_data, "vkCreateGraphicsPipelines",
3109 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3110 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3111
3112 skip_call |= validate_ranged_enum(
3113 report_data, "vkCreateGraphicsPipelines",
3114 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3115 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3116 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3117
3118 skip_call |= validate_ranged_enum(
3119 report_data, "vkCreateGraphicsPipelines",
3120 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3121 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3122 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3123
3124 skip_call |= validate_ranged_enum(
3125 report_data, "vkCreateGraphicsPipelines",
3126 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3127 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3128
3129 skip_call |=
3130 validate_flags(report_data, "vkCreateGraphicsPipelines",
3131 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3132 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3133 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3134 }
3135 }
3136
Dustin Gravesc900f572016-05-16 11:07:59 -06003137 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3138 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3139 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3140 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3141 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3142 i);
3143 }
3144
3145 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3146 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3147 skip_call |= validate_ranged_enum(
3148 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3149 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3150 }
3151 }
3152 }
3153 }
3154
3155 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003156 PreCreateGraphicsPipelines(device, pCreateInfos);
3157
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003158 result = get_dispatch_table(pc_device_table_map, device)
3159 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003160
Dustin Gravesc900f572016-05-16 11:07:59 -06003161 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003162 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003163
3164 return result;
3165}
3166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003167bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003168 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3169
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003170 if (pCreateInfos != nullptr) {
3171 // TODO: Handle count!
3172 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003173 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003174 }
3175
3176 return true;
3177}
3178
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003179VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3180 const VkComputePipelineCreateInfo *pCreateInfos,
3181 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003183 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003185 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003186
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003187 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3188 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003189
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003190 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003191 PreCreateComputePipelines(device, pCreateInfos);
3192
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003193 result = get_dispatch_table(pc_device_table_map, device)
3194 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003195
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003196 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003197 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003198
3199 return result;
3200}
3201
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003202VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3203 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003204 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003205 assert(my_data != NULL);
3206
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003207 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003208
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003209 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003210 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003211 }
3212}
3213
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003214VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3215 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003216 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003217 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003218 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003219 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003220
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003221 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003222
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003223 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003224 result =
3225 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003226
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003227 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003228 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003229
3230 return result;
3231}
3232
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003233VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3234 const VkAllocationCallbacks *pAllocator) {
3235 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003237 assert(my_data != NULL);
3238
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003239 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003240
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003241 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003242 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003243 }
3244}
3245
Chia-I Wu01ca2372016-05-13 14:37:49 +08003246VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3247 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003248 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003249 bool skip_call = false;
3250 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3251 assert(device_data != NULL);
3252 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003253
Dustin Gravesc900f572016-05-16 11:07:59 -06003254 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003255
Dustin Gravesc900f572016-05-16 11:07:59 -06003256 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3257 if (pCreateInfo != nullptr) {
3258 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3259 if (pCreateInfo->compareEnable == VK_TRUE) {
3260 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3261 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3262 }
3263
3264 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3265 // valid VkBorderColor value
3266 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3267 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3268 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3269 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3270 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3271 }
3272 }
3273
3274 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003275 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3276
Dustin Gravesc900f572016-05-16 11:07:59 -06003277 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003278 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003279
3280 return result;
3281}
3282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003283VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3284 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003285 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003286 assert(my_data != NULL);
3287
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003288 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003290 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003291 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003292 }
3293}
3294
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003295VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3296 const VkAllocationCallbacks *pAllocator,
3297 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003298 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003299 bool skip_call = false;
3300 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3301 assert(device_data != nullptr);
3302 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003303
Dustin Gravesc900f572016-05-16 11:07:59 -06003304 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003305
Dustin Gravesc900f572016-05-16 11:07:59 -06003306 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3307 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3308 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3309 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3310 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3311 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3312 // valid VkSampler handles
3313 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3314 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3315 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3316 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3317 ++descriptor_index) {
3318 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3319 skip_call |=
3320 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3321 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3322 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3323 " specified as VK_NULL_HANDLE",
3324 i, descriptor_index);
3325 }
3326 }
3327 }
3328
3329 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3330 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3331 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3332 skip_call |=
3333 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3334 UNRECOGNIZED_VALUE, LayerName,
3335 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3336 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3337 i, i);
3338 }
3339 }
3340 }
3341 }
3342
3343 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003344 result =
3345 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003346
Dustin Gravesc900f572016-05-16 11:07:59 -06003347 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003348 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003349
3350 return result;
3351}
3352
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003353VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3354 const VkAllocationCallbacks *pAllocator) {
3355 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003356 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003357 assert(my_data != NULL);
3358
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003359 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003360
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003361 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003362 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003363 }
3364}
3365
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003366VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3367 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003368 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003369 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003370 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003371 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003372
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003373 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003374
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003375 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3376
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003377 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003378 result =
3379 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003380
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003381 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003382 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003383
3384 return result;
3385}
3386
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003387VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3388 const VkAllocationCallbacks *pAllocator) {
3389 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003390 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003391 assert(my_data != NULL);
3392
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003393 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003394
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003395 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003396 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003397 }
3398}
3399
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003400VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3401 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003402 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003403 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003404 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3405 assert(my_data != NULL);
3406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003407 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003409 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003410 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3411
3412 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003414
3415 return result;
3416}
3417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003418VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3419 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003420 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003421 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003422 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003423 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003425 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003426
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003427 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003428 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3429
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003430 validate_result(my_data->report_data, "vkAllocateDescriptorSets", 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 VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003437 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003438 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003439 bool skip_call = false;
3440 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3441 assert(device_data != nullptr);
3442 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003443
Dustin Gravesc900f572016-05-16 11:07:59 -06003444 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003445
Dustin Gravesc900f572016-05-16 11:07:59 -06003446 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3447 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3448 // validate_array()
3449 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3450 pDescriptorSets, true, true);
3451
3452 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003453 result = get_dispatch_table(pc_device_table_map, device)
3454 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003455
Dustin Gravesc900f572016-05-16 11:07:59 -06003456 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003457 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003458
3459 return result;
3460}
3461
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003462VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3463 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3464 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003465 bool skip_call = false;
3466 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3467 assert(device_data != NULL);
3468 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003469
Dustin Gravesc900f572016-05-16 11:07:59 -06003470 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3471 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003472
Dustin Gravesc900f572016-05-16 11:07:59 -06003473 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3474 if (pDescriptorWrites != NULL) {
3475 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3476 // descriptorCount must be greater than 0
3477 if (pDescriptorWrites[i].descriptorCount == 0) {
3478 skip_call |=
3479 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3480 REQUIRED_PARAMETER, LayerName,
3481 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3482 }
3483
3484 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3485 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3486 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3487 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3488 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3489 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3490 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3491 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3492 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3493 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3494 __LINE__, REQUIRED_PARAMETER, LayerName,
3495 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3496 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3497 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3498 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3499 i, i);
3500 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3501 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3502 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3503 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3504 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3505 ++descriptor_index) {
3506 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3507 "pDescriptorWrites[i].pImageInfo[i].imageView",
3508 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3509 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3510 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3511 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3512 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3513 }
3514 }
3515 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3516 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3517 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3518 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3519 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3520 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3521 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3522 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3523 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3524 __LINE__, REQUIRED_PARAMETER, LayerName,
3525 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3526 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3527 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3528 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3529 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003530 } else {
3531 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3532 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3533 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3534 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3535 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003536 }
3537 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3538 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3539 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3540 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3541 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3542 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3543 __LINE__, REQUIRED_PARAMETER, LayerName,
3544 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3545 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3546 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3547 i, i);
3548 } else {
3549 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3550 ++descriptor_index) {
3551 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3552 "pDescriptorWrites[i].pTexelBufferView[i]",
3553 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3554 }
3555 }
3556 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003557
3558 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3559 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3560 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3561 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3562 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3563 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3564 skip_call |=
3565 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003566 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003567 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3568 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3569 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3570 }
3571 }
3572 }
3573 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3574 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3575 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3576 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3577 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3578 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3579 skip_call |=
3580 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003581 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003582 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3583 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3584 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3585 }
3586 }
3587 }
3588 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003589 }
3590 }
3591
3592 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003593 get_dispatch_table(pc_device_table_map, device)
3594 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003595 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003596}
3597
Chia-I Wu01ca2372016-05-13 14:37:49 +08003598VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003599 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003600 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003601 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003602 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003603 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003604
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003605 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003606
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003607 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003608 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3609
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003610 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003611 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003612
3613 return result;
3614}
3615
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003616VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3617 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003618 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003619 assert(my_data != NULL);
3620
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003621 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003622
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003623 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003624 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003625 }
3626}
3627
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003628bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3629 bool skip_call = false;
3630 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3631
3632 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3633 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3634 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 -06003635 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003636 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3637 }
3638 }
3639 return skip_call;
3640}
3641
Chia-I Wu01ca2372016-05-13 14:37:49 +08003642VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003643 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003644 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003645 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003646 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003647 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003648
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003649 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3650 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003651
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003652 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003653 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3654
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003655 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003656 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003657
3658 return result;
3659}
3660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003661VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3662 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003663 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003664 assert(my_data != NULL);
3665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003666 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003667
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003668 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003669 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003670 }
3671}
3672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003673VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3674 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003675 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003676 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003677
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003678 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003679
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003680 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003681 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003682 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003683}
3684
Chia-I Wu01ca2372016-05-13 14:37:49 +08003685VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003686 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
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 |=
Dustin Gravesde628532016-04-21 16:30:17 -06003693 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003694
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003695 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003697 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003698 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3699
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003700 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003701 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003702
3703 return result;
3704}
3705
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003706VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3707 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003708 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003709 assert(my_data != NULL);
3710
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003711 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003712
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003713 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003714 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003715 }
3716}
3717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003718VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003719 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003720 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003721 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3722 assert(my_data != NULL);
3723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003724 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003726 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003727 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3728
3729 validate_result(my_data->report_data, "vkResetCommandPool", result);
3730 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003731
3732 return result;
3733}
3734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003735VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3736 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003737 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003738 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003739 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003740 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003742 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003743
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003744 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003745 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3746
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003747 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003748 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003749
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003750 return result;
3751}
3752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003753VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003754 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003755 bool skip_call = false;
3756 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3757 assert(device_data != nullptr);
3758 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003759
Dustin Gravesc900f572016-05-16 11:07:59 -06003760 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003761
Dustin Gravesc900f572016-05-16 11:07:59 -06003762 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3763 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3764 // validate_array()
3765 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3766 pCommandBuffers, true, true);
3767
3768 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003769 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003770 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003771 }
3772}
3773
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003774bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3775 bool skip_call = false;
3776 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3777 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3778
3779 if (pInfo != NULL) {
3780 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3781 skip_call |=
3782 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 -06003783 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003784 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3785 "inheritedQueries.");
3786 }
3787
3788 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3789 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3790 skip_call |=
3791 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 -06003792 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003793 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3794 "valid combination of VkQueryControlFlagBits.",
3795 pInfo->queryFlags);
3796 }
3797 }
3798 return skip_call;
3799}
3800
3801VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003802 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003803 bool skip_call = false;
3804 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3805 assert(device_data != nullptr);
3806 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003807
Dustin Gravesc900f572016-05-16 11:07:59 -06003808 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003809
Dustin Gravesc900f572016-05-16 11:07:59 -06003810 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3811 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3812 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3813 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3814 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3815
3816 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003817 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003818 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003819
3820 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3821 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3822
Dustin Gravesc900f572016-05-16 11:07:59 -06003823 // TODO: This only needs to be validated when the inherited queries feature is enabled
3824 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3825 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3826
3827 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3828 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3829 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3830 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3831 }
3832
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003833 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3834
Dustin Gravesc900f572016-05-16 11:07:59 -06003835 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003836 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3837
Dustin Gravesc900f572016-05-16 11:07:59 -06003838 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003839 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003840
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003841 return result;
3842}
3843
Chia-I Wu01ca2372016-05-13 14:37:49 +08003844VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3846 assert(my_data != NULL);
3847
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003848 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003849
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003850 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003851
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003852 return result;
3853}
3854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003855VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003856 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003857 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3858 assert(my_data != NULL);
3859
Dustin Graves16d18972016-05-09 17:36:57 -06003860 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003861
Dustin Graves16d18972016-05-09 17:36:57 -06003862 if (!skip_call) {
3863 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3864
3865 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3866 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003867
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003868 return result;
3869}
3870
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003871VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3872 VkPipeline pipeline) {
3873 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003874 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3875 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003876
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003877 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003878
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003879 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003880 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3881 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003882}
3883
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003884VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3885 const VkViewport *pViewports) {
3886 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003887 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003888 assert(my_data != NULL);
3889
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003890 skip_call |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003892 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003893 get_dispatch_table(pc_device_table_map, commandBuffer)
3894 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003895 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003896}
3897
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003898VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3899 const VkRect2D *pScissors) {
3900 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003901 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003902 assert(my_data != NULL);
3903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003904 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003905
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003906 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003907 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3908 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003909}
3910
Chia-I Wu01ca2372016-05-13 14:37:49 +08003911VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003912 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913}
3914
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003915VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
3916 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003917 get_dispatch_table(pc_device_table_map, commandBuffer)
3918 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003919}
3920
Chia-I Wu01ca2372016-05-13 14:37:49 +08003921VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003922 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003923 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003924 assert(my_data != NULL);
3925
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003926 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003927
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003928 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003929 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3930 }
Cody Northrop12365112015-08-17 11:10:49 -06003931}
3932
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003933VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003934 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003935}
3936
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003937VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
3938 uint32_t compareMask) {
3939 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003940 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3941 assert(my_data != NULL);
3942
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003943 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06003944
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003945 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003946 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3947 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003948}
3949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003950VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
3951 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003952 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3953 assert(my_data != NULL);
3954
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003955 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06003956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003957 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003958 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3959 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003960}
3961
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003962VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
3963 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003964 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3965 assert(my_data != NULL);
3966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003967 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06003968
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003969 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003970 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3971 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003972}
3973
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003974VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3975 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
3976 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
3977 const uint32_t *pDynamicOffsets) {
3978 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003980 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003981
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003982 skip_call |=
3983 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
3984 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003985
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003986 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003987 get_dispatch_table(pc_device_table_map, commandBuffer)
3988 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3989 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003990 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003991}
3992
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003993VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3994 VkIndexType indexType) {
3995 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003996 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3997 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003998
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003999 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004000
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004001 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004002 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4003 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004004}
4005
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004006VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4007 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4008 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004009 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004010 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004011
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004012 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004014 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004015 get_dispatch_table(pc_device_table_map, commandBuffer)
4016 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004017 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004018}
4019
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004020bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4021 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004022 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004023 // 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 -07004024 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004025 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 -06004026 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004027 return false;
4028 }
4029
4030 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004031 // 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 -07004032 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004033 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 -06004034 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004035 return false;
4036 }
4037
4038 return true;
4039}
4040
Chia-I Wu01ca2372016-05-13 14:37:49 +08004041VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4042 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004043 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004044
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004045 get_dispatch_table(pc_device_table_map, commandBuffer)
4046 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004047}
4048
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004049VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4050 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004051 get_dispatch_table(pc_device_table_map, commandBuffer)
4052 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004053}
4054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004055VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4056 uint32_t stride) {
4057 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004058 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4059 assert(my_data != NULL);
4060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004061 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004063 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004064 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4065 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004066}
4067
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004068VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4069 uint32_t count, uint32_t stride) {
4070 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004071 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4072 assert(my_data != NULL);
4073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004074 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004075
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004076 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004077 get_dispatch_table(pc_device_table_map, commandBuffer)
4078 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4079 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004080}
4081
Chia-I Wu01ca2372016-05-13 14:37:49 +08004082VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004083 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004084}
4085
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004086VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4087 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004088 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4089 assert(my_data != NULL);
4090
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004091 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004092
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004093 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004094 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4095 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004096}
4097
Chia-I Wu01ca2372016-05-13 14:37:49 +08004098VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4099 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004100 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004102 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004103
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004104 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
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 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004109 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004110}
4111
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004112bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4113 if (pRegions != nullptr) {
4114 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4115 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004116 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 -06004117 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004118 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4119 return false;
4120 }
4121 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4122 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004123 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 -06004124 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004125 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4126 return false;
4127 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004128 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004129
4130 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004131}
4132
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004133VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4134 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4135 const VkImageCopy *pRegions) {
4136 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004138 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004139
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004140 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4141 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004142
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004143 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004144 PreCmdCopyImage(commandBuffer, pRegions);
4145
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004146 get_dispatch_table(pc_device_table_map, commandBuffer)
4147 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004148 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004149}
4150
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004151bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4152 if (pRegions != nullptr) {
4153 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4154 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004155 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 -06004156 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004157 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4158 return false;
4159 }
4160 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4161 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004162 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 -06004163 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004164 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4165 return false;
4166 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004167 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004168
4169 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004170}
4171
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004172VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4173 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4174 const VkImageBlit *pRegions, VkFilter filter) {
4175 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004176 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004177 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004178
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004179 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4180 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004181
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004182 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004183 PreCmdBlitImage(commandBuffer, pRegions);
4184
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004185 get_dispatch_table(pc_device_table_map, commandBuffer)
4186 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004187 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004188}
4189
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004190bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4191 if (pRegions != nullptr) {
4192 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4193 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004194 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 -06004195 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004196 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4197 "enumerator");
4198 return false;
4199 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004200 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004201
4202 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004203}
4204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004205VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4206 VkImageLayout dstImageLayout, uint32_t regionCount,
4207 const VkBufferImageCopy *pRegions) {
4208 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004209 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004210 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004211
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004212 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4213 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004214
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004215 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004216 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4217
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004218 get_dispatch_table(pc_device_table_map, commandBuffer)
4219 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004220 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004221}
4222
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004223bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4224 if (pRegions != nullptr) {
4225 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4226 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004227 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 -06004228 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004229 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4230 "enumerator");
4231 return false;
4232 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004233 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004234
4235 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004236}
4237
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004238VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4239 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4240 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004241 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004242 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004243
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004244 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4245 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004246
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004247 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004248 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4249
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004250 get_dispatch_table(pc_device_table_map, commandBuffer)
4251 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004252 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004253}
4254
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004255VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4256 VkDeviceSize dataSize, const uint32_t *pData) {
4257 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004258 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004259 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004260
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004261 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004262
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004263 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004264 skip_call |= log_msg(
4265 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4266 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004267 }
4268
4269 if ((dataSize <= 0) || (dataSize > 65536)) {
4270 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 -06004271 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4272 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004273 dataSize);
4274 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004275 skip_call |= log_msg(
4276 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4277 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004278 }
4279
4280 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004281 get_dispatch_table(pc_device_table_map, commandBuffer)
4282 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004283 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004284}
4285
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004286VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4287 VkDeviceSize size, uint32_t data) {
4288 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004289 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4290 assert(my_data != NULL);
4291
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004292 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004293
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004294 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004295 skip_call |= log_msg(
4296 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4297 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004298 }
4299
4300 if (size != VK_WHOLE_SIZE) {
4301 if (size <= 0) {
4302 skip_call |= log_msg(
4303 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004304 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004305 } else if (size & 3) {
4306 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 -06004307 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004308 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4309 }
4310 }
4311
4312 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004313 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4314 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004315}
4316
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004317VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4318 const VkClearColorValue *pColor, uint32_t rangeCount,
4319 const VkImageSubresourceRange *pRanges) {
4320 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004321 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004322 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004324 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004325
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004326 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004327 get_dispatch_table(pc_device_table_map, commandBuffer)
4328 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004329 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004330}
4331
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004332VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4333 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4334 const VkImageSubresourceRange *pRanges) {
4335 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004336 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004337 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004338
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004339 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4340 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004341
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004342 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004343 get_dispatch_table(pc_device_table_map, commandBuffer)
4344 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004345 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004346}
4347
Chia-I Wu01ca2372016-05-13 14:37:49 +08004348VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4349 const VkClearAttachment *pAttachments, uint32_t rectCount,
4350 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004351 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004352 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004353 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004354
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004355 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004356
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004357 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004358 get_dispatch_table(pc_device_table_map, commandBuffer)
4359 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004360 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004361}
4362
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004363bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4364 if (pRegions != nullptr) {
4365 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4366 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4367 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004368 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004369 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004370 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4371 return false;
4372 }
4373 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4374 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4375 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004376 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004377 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004378 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4379 return false;
4380 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004381 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004382
4383 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004384}
4385
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004386VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4387 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4388 const VkImageResolve *pRegions) {
4389 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004390 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004391 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004392
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004393 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4394 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004396 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004397 PreCmdResolveImage(commandBuffer, pRegions);
4398
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004399 get_dispatch_table(pc_device_table_map, commandBuffer)
4400 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004401 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004402}
4403
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004404VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4405 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004406 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4407 assert(my_data != NULL);
4408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004409 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004410
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004411 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004412 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004414}
4415
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004416VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4417 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4419 assert(my_data != NULL);
4420
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004421 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004423 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004424 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4425 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004426}
4427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004428VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4429 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4430 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4431 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4432 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4433 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004434 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004435 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004437 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4438 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4439 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004441 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004442 get_dispatch_table(pc_device_table_map, commandBuffer)
4443 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4444 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004445 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004446}
4447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004448VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4449 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4450 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4451 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4452 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4453 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004455 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004456
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004457 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4458 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4459 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004460
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004461 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004462 get_dispatch_table(pc_device_table_map, commandBuffer)
4463 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4464 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004465 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004466}
4467
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004468VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4469 VkQueryControlFlags flags) {
4470 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004471 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4472 assert(my_data != NULL);
4473
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004474 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004476 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004477 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4478 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004479}
4480
Chia-I Wu01ca2372016-05-13 14:37:49 +08004481VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004482 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004483 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4484 assert(my_data != NULL);
4485
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004486 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004488 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004489 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4490 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004491}
4492
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004493VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4494 uint32_t queryCount) {
4495 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004496 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4497 assert(my_data != NULL);
4498
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004499 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004502 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4503 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004504}
4505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004506bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4507 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004508
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004509 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004510
4511 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004512}
4513
Chia-I Wu01ca2372016-05-13 14:37:49 +08004514VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4515 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004516 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004517 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4518 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004519
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004520 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004521
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004522 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004523 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4524
4525 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4526 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004527}
4528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004529VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4530 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4531 VkDeviceSize stride, VkQueryResultFlags flags) {
4532 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004533 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4534 assert(my_data != NULL);
4535
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004536 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4537 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004538
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004539 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004540 get_dispatch_table(pc_device_table_map, commandBuffer)
4541 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4542 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004543}
4544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004545VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4546 uint32_t offset, uint32_t size, const void *pValues) {
4547 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004548 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004549 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004550
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004551 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004552
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004553 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004554 get_dispatch_table(pc_device_table_map, commandBuffer)
4555 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004556 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004557}
4558
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004559VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4560 VkSubpassContents contents) {
4561 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004562 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004563 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004565 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004566
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004567 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004568 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004569 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004570}
4571
Chia-I Wu01ca2372016-05-13 14:37:49 +08004572VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004573 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004574 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4575 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004576
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004577 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004578
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004579 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004580 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4581 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004582}
4583
Chia-I Wu01ca2372016-05-13 14:37:49 +08004584VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004585 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004586}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004587
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004588VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4589 const VkCommandBuffer *pCommandBuffers) {
4590 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004591 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004592 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004593
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004594 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004595
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004596 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004597 get_dispatch_table(pc_device_table_map, commandBuffer)
4598 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004599 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004600}
4601
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004602VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004603 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4604}
4605
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004606VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4607 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004608 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4609}
4610
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004611VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4612 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004613 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4614 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4615
4616 return VK_ERROR_LAYER_NOT_PRESENT;
4617}
4618
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004619VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4620 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004621 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004622 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004623 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004624
4625 assert(physicalDevice);
4626
4627 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4628 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004629}
4630
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004631// WSI Extension Functions
4632
4633VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004634 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004635 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004636 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004637 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4638 assert(my_data != NULL);
4639
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004640 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004641
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004642 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004643 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4644
4645 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4646 }
4647
4648 return result;
4649}
4650
4651VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004652 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004653 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004654 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004655 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4656 assert(my_data != NULL);
4657
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004658 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004659 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004661 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004662 result = get_dispatch_table(pc_device_table_map, device)
4663 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4664
4665 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4666 }
4667
4668 return result;
4669}
4670
4671VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004672 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004673 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004674 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004675 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4676 assert(my_data != NULL);
4677
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004678 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004679 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004681 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004682 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004683 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004684
4685 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4686 }
4687
4688 return result;
4689}
4690
4691VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4692 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004693 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004694 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4695 assert(my_data != NULL);
4696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004697 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004698
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004699 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004700 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4701
4702 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4703 }
4704
4705 return result;
4706}
4707
4708VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4709 VkSurfaceKHR surface, VkBool32 *pSupported) {
4710 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004711 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004712 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4713 assert(my_data != NULL);
4714
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004715 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004716 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004718 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004719 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4720 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4721
4722 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4723 }
4724
4725 return result;
4726}
4727
4728VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4729 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4730 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004731 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4733 assert(my_data != NULL);
4734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004735 skip_call |=
4736 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004738 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004739 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4740 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4741
4742 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4743 }
4744
4745 return result;
4746}
4747
4748VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4749 uint32_t *pSurfaceFormatCount,
4750 VkSurfaceFormatKHR *pSurfaceFormats) {
4751 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004752 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004753 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4754 assert(my_data != NULL);
4755
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004756 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4757 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004758
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004759 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004760 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4761 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4762
4763 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4764 }
4765
4766 return result;
4767}
4768
4769VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4770 uint32_t *pPresentModeCount,
4771 VkPresentModeKHR *pPresentModes) {
4772 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004773 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004774 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4775 assert(my_data != NULL);
4776
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004777 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4778 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004779
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004780 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004781 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4782 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4783
4784 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4785 }
4786
4787 return result;
4788}
4789
4790#ifdef VK_USE_PLATFORM_WIN32_KHR
4791VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4792 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4793 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4794
4795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4796 assert(my_data != NULL);
4797
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004798 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004799
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004800 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004801 result =
4802 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4803 }
4804
4805 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4806
4807 return result;
4808}
4809#endif // VK_USE_PLATFORM_WIN32_KHR
4810
4811#ifdef VK_USE_PLATFORM_XCB_KHR
4812VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4813 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4814 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4815
4816 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4817 assert(my_data != NULL);
4818
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004819 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004821 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004822 result =
4823 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4824 }
4825
4826 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4827
4828 return result;
4829}
4830
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004831VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4832 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4833 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004834 VkBool32 result = false;
4835
4836 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4837 assert(my_data != NULL);
4838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004839 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4840 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004841
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004842 if (!skip_call) {
4843 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4844 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004845 }
4846
4847 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004848}
4849#endif // VK_USE_PLATFORM_XCB_KHR
4850
4851#ifdef VK_USE_PLATFORM_XLIB_KHR
4852VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004853 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004854 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4855
4856 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4857 assert(my_data != NULL);
4858
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004859 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004860
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004861 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004862 result =
4863 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4864 }
4865
4866 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4867
4868 return result;
4869}
4870
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004871VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4872 uint32_t queueFamilyIndex, Display *dpy,
4873 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004874 VkBool32 result = false;
4875
4876 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4877 assert(my_data != NULL);
4878
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004879 bool skip_call =
4880 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004881
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004882 if (!skip_call) {
4883 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4884 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004885 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004886}
4887#endif // VK_USE_PLATFORM_XLIB_KHR
4888
4889#ifdef VK_USE_PLATFORM_MIR_KHR
4890VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004891 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004892 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4893
4894 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4895 assert(my_data != NULL);
4896
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004897 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004898
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004899 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004900 result =
4901 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4902 }
4903
4904 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4905
4906 return result;
4907}
4908
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004909VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4910 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004911 VkBool32 result = false;
4912
4913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4914 assert(my_data != NULL);
4915
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004916 bool skip_call =
4917 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004918
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004919 if (!skip_call) {
4920 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4921 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004922 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004923}
4924#endif // VK_USE_PLATFORM_MIR_KHR
4925
4926#ifdef VK_USE_PLATFORM_WAYLAND_KHR
4927VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004928 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004929 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4930
4931 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4932 assert(my_data != NULL);
4933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004934 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004935
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004936 if (!skip_call) {
4937 result = get_dispatch_table(pc_instance_table_map, instance)
4938 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004939 }
4940
4941 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
4942
4943 return result;
4944}
4945
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004946VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4947 uint32_t queueFamilyIndex,
4948 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949 VkBool32 result = false;
4950
4951 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4952 assert(my_data != NULL);
4953
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004954 bool skip_call =
4955 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004957 if (!skip_call) {
4958 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4959 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004960 }
4961}
4962#endif // VK_USE_PLATFORM_WAYLAND_KHR
4963
4964#ifdef VK_USE_PLATFORM_ANDROID_KHR
4965VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004966 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004967 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4968
4969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4970 assert(my_data != NULL);
4971
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004972 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004974 if (!skip_call) {
4975 result = get_dispatch_table(pc_instance_table_map, instance)
4976 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004977 }
4978
4979 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
4980
4981 return result;
4982}
4983#endif // VK_USE_PLATFORM_ANDROID_KHR
4984
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004985static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004986
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004987static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004988
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004989static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004990
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004991static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004992
Chia-I Wu01ca2372016-05-13 14:37:49 +08004993VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08004994 assert(device);
4995
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004996 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4997
Dustin Graves080069b2016-04-05 13:48:15 -06004998 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004999 return NULL;
5000 }
5001
Chia-I Wuf9b01382016-05-16 07:37:41 +08005002 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5003 if (proc)
5004 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005005
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005006 proc = InterceptWsiEnabledCommand(funcName, device);
5007 if (proc)
5008 return proc;
5009
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005010 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005011 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005012 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005013}
5014
Chia-I Wu01ca2372016-05-13 14:37:49 +08005015VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005016 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005017 if (!proc)
5018 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005019
5020 if (!proc)
5021 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005022
Chia-I Wu617f2a42016-05-16 07:41:17 +08005023 if (proc)
5024 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005025
Chia-I Wu617f2a42016-05-16 07:41:17 +08005026 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005027
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005028 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005029
Chia-I Wu617f2a42016-05-16 07:41:17 +08005030 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005031 if (!proc)
5032 proc = InterceptWsiEnabledCommand(funcName, instance);
5033
Chia-I Wu617f2a42016-05-16 07:41:17 +08005034 if (proc)
5035 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005036
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005037 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005038 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005039 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005040}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005041
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005042static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005043 static const struct {
5044 const char *name;
5045 PFN_vkVoidFunction proc;
5046 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005047 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5048 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5049 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5050 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5051 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5052 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5053 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5054 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5055 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5056 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5057 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5058 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5059 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5060 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5061 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5062 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5063 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Chia-I Wu617f2a42016-05-16 07:41:17 +08005064 };
5065
5066 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5067 if (!strcmp(core_instance_commands[i].name, name))
5068 return core_instance_commands[i].proc;
5069 }
5070
5071 return nullptr;
5072}
5073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005074static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005075 static const struct {
5076 const char *name;
5077 PFN_vkVoidFunction proc;
5078 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005079 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5080 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5081 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5082 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5083 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5084 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5085 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5086 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5087 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5088 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5089 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5090 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5091 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5092 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5093 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5094 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5095 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5096 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5097 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5098 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5099 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5100 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5101 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5102 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5103 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5104 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5105 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5106 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5107 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5108 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5109 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5110 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5111 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5112 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5113 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5114 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5115 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5116 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5117 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5118 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5119 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5120 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5121 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5122 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5123 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5124 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5125 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5126 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5127 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5128 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5129 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5130 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5131 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5132 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5133 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5134 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5135 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5136 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5137 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5138 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5139 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5140 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5141 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5142 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5143 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5144 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5145 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5146 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5147 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5148 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5149 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5150 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5151 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5152 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5153 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5154 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5155 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5156 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5157 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5158 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5159 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5160 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5161 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5162 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5163 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5164 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5165 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5166 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5167 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5168 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5169 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5170 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5171 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5172 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5173 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5174 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5175 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5176 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5177 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5178 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5179 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5180 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5181 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5182 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5183 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5184 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5185 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5186 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5187 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5188 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5189 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5190 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5191 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5192 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5193 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5194 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5195 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Chia-I Wuf9b01382016-05-16 07:37:41 +08005196 };
5197
5198 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5199 if (!strcmp(core_device_commands[i].name, name))
5200 return core_device_commands[i].proc;
5201 }
5202
5203 return nullptr;
5204}
5205
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005206static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005207 static const struct {
5208 const char *name;
5209 PFN_vkVoidFunction proc;
5210 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005211 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5212 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5213 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5214 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005215 };
5216
5217 if (device) {
5218 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5219 if (!device_data->wsi_enabled)
5220 return nullptr;
5221 }
5222
5223 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5224 if (!strcmp(wsi_device_commands[i].name, name))
5225 return wsi_device_commands[i].proc;
5226 }
5227
5228 return nullptr;
5229}
5230
5231static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5232 static const struct {
5233 const char *name;
5234 PFN_vkVoidFunction proc;
5235 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005236 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5237 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5238 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5239 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5240 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5241 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005242 };
5243
5244 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005245 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005246 return nullptr;
5247
5248 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5249 if (!strcmp(wsi_instance_commands[i].name, name))
5250 return wsi_instance_commands[i].proc;
5251 }
5252
5253#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005254 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005255 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5256#endif // VK_USE_PLATFORM_WIN32_KHR
5257#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005258 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005259 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005260 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005261 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5262#endif // VK_USE_PLATFORM_XCB_KHR
5263#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005264 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005265 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005266 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005267 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5268#endif // VK_USE_PLATFORM_XLIB_KHR
5269#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005270 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005271 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005272 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005273 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5274#endif // VK_USE_PLATFORM_MIR_KHR
5275#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005276 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005277 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005278 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5279 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005280 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5281#endif // VK_USE_PLATFORM_WAYLAND_KHR
5282#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005283 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005284 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5285#endif // VK_USE_PLATFORM_ANDROID_KHR
5286
5287 return nullptr;
5288}
5289
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005290} // namespace parameter_validation
5291
5292// vk_layer_logging.h expects these to be defined
5293
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005294VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5295 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5296 const VkAllocationCallbacks *pAllocator,
5297 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005298 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005299}
5300
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005301VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5302 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005303 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005304}
5305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005306VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5307 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5308 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005309 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005310}
5311
5312// loader-layer interface v0
5313
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005314VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5315 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005316 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005317}
5318
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005319VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5320 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005321 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005322}
5323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005324VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5325 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005326 // the layer command handles VK_NULL_HANDLE just fine internally
5327 assert(physicalDevice == VK_NULL_HANDLE);
5328 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005329}
5330
5331VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5332 const char *pLayerName, uint32_t *pCount,
5333 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005334 // the layer command handles VK_NULL_HANDLE just fine internally
5335 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005336 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005337}
5338
5339VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005340 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005341}
5342
5343VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005344 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005345}