blob: 376bc77a08c25f105c6f5088ae52eaf3fc840dcc [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
26#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060027#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30
31#include <iostream>
32#include <string>
33#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050034#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060035#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060036#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060038#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070039#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060040#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041#include "vk_enum_validate_helper.h"
42#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060043
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_table.h"
45#include "vk_layer_data.h"
46#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060047#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070048#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060049
Dustin Graves8ffbbf62016-07-22 13:19:46 -060050#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060051#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070052
Chia-I Wu1a6b1932016-05-13 14:07:36 +080053namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060054
Cody Northrop55443ef2015-09-28 15:09:32 -060055struct layer_data {
Chia-I Wua570b7c2016-05-16 07:48:14 +080056 VkInstance instance;
57
Jeremy Hayes99a96322015-06-26 12:48:09 -060058 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070059 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060060
Ian Elliotted6b5ac2016-04-28 09:08:13 -060061 // The following are for keeping track of the temporary callbacks that can
62 // be used in vkCreateInstance and vkDestroyInstance:
63 uint32_t num_tmp_callbacks;
64 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
65 VkDebugReportCallbackEXT *tmp_callbacks;
66
Jon Ashburn5484e0c2016-03-08 17:48:44 -070067 // TODO: Split instance/device structs
68 // Device Data
69 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060070 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Mark Lobodzinskia4932512016-06-27 15:13:00 -060071 VkPhysicalDeviceLimits device_limits;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060072 VkPhysicalDeviceFeatures physical_device_features;
73 VkPhysicalDevice physical_device;
Michael Lentinebdf744f2016-01-27 15:43:43 -060074
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060075 bool wsi_enabled;
76
Mark Lobodzinskia4932512016-06-27 15:13:00 -060077 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060078 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060079 physical_device_features{}, physical_device{}, wsi_enabled(false){};
Cody Northrop55443ef2015-09-28 15:09:32 -060080};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060082static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070083static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060084static device_table_map pc_device_table_map;
85static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060086
Jeremy Hayes99a96322015-06-26 12:48:09 -060087// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070088debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060089 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060090 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060091#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060092 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 -060093#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060094 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060095
96 return data->report_data;
97}
98
99// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700100debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600101 dispatch_key key = get_dispatch_key(object);
102 layer_data *data = get_my_data_ptr(key, layer_data_map);
103#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -0600104 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 -0600105#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -0600106 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600107 return data->report_data;
108}
109
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600110static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600111
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600112 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600113}
114
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600115VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
116 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
117 const VkAllocationCallbacks *pAllocator,
118 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700119 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700120 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600121
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700122 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700123 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600124 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600125 }
126
127 return result;
128}
129
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600130VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800131 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700132 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700133 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600134
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700135 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700136 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600137}
138
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600139VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
140 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
141 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700142 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
143 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700144}
145
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700146static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600147
Chia-I Wu3384db82016-05-16 07:30:58 +0800148static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600149 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800150};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700151
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600153 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700154 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
155 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
156 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
157 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
158 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 -0700159 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600161 return false;
162 }
163
164 return true;
165}
166
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
168 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600169 return "unrecognized enumerator";
170 }
171
172 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600180 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600183 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600186 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
187 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600189 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
190 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700191 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600192 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
193 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700194 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600195 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
196 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600198 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
199 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700200 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600201 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
202 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700203 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800204 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600205 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700206 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800207 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600208 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700209 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700210 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
211 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600212
213 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700214 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600215 enumeratorString += string;
216
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700217 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600218 enumeratorString += '|';
219 }
220 }
221
222 return enumeratorString;
223}
224
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700225static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
226 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
227 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
228 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
229 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
230 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600231 return false;
232 }
233
234 return true;
235}
236
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
238 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600239 return "unrecognized enumerator";
240 }
241
242 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600244 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
245 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700246 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600247 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600248 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700249 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600250 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
251 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700252 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600253 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
254 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700255 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600256 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
257 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700258 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800259 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600260 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600262 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
263 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700264 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800265 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600267
268 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700269 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600270 enumeratorString += string;
271
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700272 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600273 enumeratorString += '|';
274 }
275 }
276
277 return enumeratorString;
278}
279
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700280static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
281 VkQueueFlagBits allFlags =
282 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
283 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600284 return false;
285 }
286
287 return true;
288}
289
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700290static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
291 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600292 return "unrecognized enumerator";
293 }
294
295 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700296 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800297 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600298 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700299 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600300 strings.push_back("VK_QUEUE_COMPUTE_BIT");
301 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700302 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800303 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600304 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700305 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600306 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
307 }
308
309 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700310 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600311 enumeratorString += string;
312
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700313 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600314 enumeratorString += '|';
315 }
316 }
317
318 return enumeratorString;
319}
320
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700321static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
322 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
323 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
324 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
325 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600326 return false;
327 }
328
329 return true;
330}
331
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
333 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600334 return "unrecognized enumerator";
335 }
336
337 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700338 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600339 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
340 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700341 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800342 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600343 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700344 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
346 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800348 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600349 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700350 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800351 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600352 }
353
354 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700355 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600356 enumeratorString += string;
357
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700358 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600359 enumeratorString += '|';
360 }
361 }
362
363 return enumeratorString;
364}
365
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700366static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700367 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600369 return false;
370 }
371
372 return true;
373}
374
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700375static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
376 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600377 return "unrecognized enumerator";
378 }
379
380 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700381 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800382 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600383 }
384
385 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700386 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600387 enumeratorString += string;
388
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700389 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600390 enumeratorString += '|';
391 }
392 }
393
394 return enumeratorString;
395}
396
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700397static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
398 VkSparseImageFormatFlagBits allFlags =
399 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
400 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
401 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600403 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600404
405 return true;
406}
407
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700408static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
409 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600410 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600411 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600412
413 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700414 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800415 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600416 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800418 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600419 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700420 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800421 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600422 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600423
424 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700425 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600426 enumeratorString += string;
427
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700428 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600429 enumeratorString += '|';
430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600431 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600432
433 return enumeratorString;
434}
435
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700436static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700437 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600439 return false;
440 }
441
442 return true;
443}
444
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700445static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
446 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600447 return "unrecognized enumerator";
448 }
449
450 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700451 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600452 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
453 }
454
455 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700456 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600457 enumeratorString += string;
458
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700459 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600460 enumeratorString += '|';
461 }
462 }
463
464 return enumeratorString;
465}
466
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700467static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
468 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
469 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
470 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
471 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
472 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600473 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
474 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
475 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700476 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600477 return false;
478 }
479
480 return true;
481}
482
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
484 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 return "unrecognized enumerator";
486 }
487
488 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700499 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700501 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700502 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600503 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700504 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700505 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600506 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700507 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700508 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600509 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700510 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700511 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600512 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700513 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700514 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700516 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700517 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700519 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700520 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600521 }
522
523 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700524 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600525 enumeratorString += string;
526
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700527 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 enumeratorString += '|';
529 }
530 }
531
532 return enumeratorString;
533}
534
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700535static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
536 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
537 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
538 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600539 return false;
540 }
541
542 return true;
543}
544
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700545static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
546 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600547 return "unrecognized enumerator";
548 }
549
550 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700551 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600552 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
553 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700554 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600555 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
556 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700557 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600558 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
559 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700560 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600561 strings.push_back("VK_QUERY_RESULT_64_BIT");
562 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600563
564 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700565 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600566 enumeratorString += string;
567
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700568 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600569 enumeratorString += '|';
570 }
571 }
572
573 return enumeratorString;
574}
575
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700576static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
577 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
578 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
579 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
580 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
581 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600582 return false;
583 }
584
585 return true;
586}
587
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
589 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600590 return "unrecognized enumerator";
591 }
592
593 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600595 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
596 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700597 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
599 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700600 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600601 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
602 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700603 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600604 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
605 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700606 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600607 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
608 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700609 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800610 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600611 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700612 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
614 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700615 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800616 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700618 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600619 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
620 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600621
622 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700623 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600624 enumeratorString += string;
625
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700626 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600627 enumeratorString += '|';
628 }
629 }
630
631 return enumeratorString;
632}
633
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700634static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
635 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
636 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
637 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600638 return false;
639 }
640
641 return true;
642}
643
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700644static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
645 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600646 return "unrecognized enumerator";
647 }
648
649 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700650 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600651 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
652 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700653 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600654 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
655 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700656 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600657 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600658 }
659
660 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700661 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600662 enumeratorString += string;
663
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700664 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600665 enumeratorString += '|';
666 }
667 }
668
669 return enumeratorString;
670}
671
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700672static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
673 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
674 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
675 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
676 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600677 return false;
678 }
679
680 return true;
681}
682
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700683static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
684 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600685 return "unrecognized enumerator";
686 }
687
688 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700689 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600690 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
691 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700692 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600693 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
694 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700695 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600696 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
697 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700698 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600699 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
700 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700701 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600702 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600704
705 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700706 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600707 enumeratorString += string;
708
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700709 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 enumeratorString += '|';
711 }
712 }
713
714 return enumeratorString;
715}
716
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700717static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
718 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
719 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
720 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600721 return false;
722 }
723
724 return true;
725}
726
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700727static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
728 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600729 return "unrecognized enumerator";
730 }
731
732 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700733 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800734 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600735 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700736 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800737 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600738 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700739 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800740 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600741 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700742 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800743 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600744 }
745
746 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700747 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600748 enumeratorString += string;
749
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700750 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600751 enumeratorString += '|';
752 }
753 }
754
755 return enumeratorString;
756}
757
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700758static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
759 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
760 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
761 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600762 return false;
763 }
764
765 return true;
766}
767
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700768static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
769 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600770 return "unrecognized enumerator";
771 }
772
773 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700774 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600775 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
776 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700777 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600778 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
779 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700780 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600781 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600782 }
783
784 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700785 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600786 enumeratorString += string;
787
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700788 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600789 enumeratorString += '|';
790 }
791 }
792
793 return enumeratorString;
794}
795
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700796static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
797 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
798 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
799 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
800 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600801 return false;
802 }
803
804 return true;
805}
806
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
808 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600809 return "unrecognized enumerator";
810 }
811
812 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700813 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600814 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600815 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700816 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600817 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600818 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700819 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600820 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
821 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700822 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600823 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
824 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700825 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600826 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600827 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600829 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600830 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700831 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600832 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600833 }
834
835 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700836 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600837 enumeratorString += string;
838
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700839 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600840 enumeratorString += '|';
841 }
842 }
843
844 return enumeratorString;
845}
846
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700847static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800848 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700849 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
850 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
851 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
852 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
853 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
854 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 -0700855 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700856 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600857 return false;
858 }
859
860 return true;
861}
862
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
864 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 return "unrecognized enumerator";
866 }
867
868 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800870 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800873 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600882 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700885 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600894 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700899 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600900 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
901 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700902 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600903 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
904 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700905 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700906 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600907 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600909 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
910 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600912 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
913 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600915 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
916 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700917 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600918 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600919 }
920
921 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700922 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600923 enumeratorString += string;
924
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700925 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600926 enumeratorString += '|';
927 }
928 }
929
930 return enumeratorString;
931}
932
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700933static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800934 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
936 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
937 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
938 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
939 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 +0800940
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700941 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600942 return false;
943 }
944
945 return true;
946}
947
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
949 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600950 return "unrecognized enumerator";
951 }
952
953 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600983 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700984 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800985 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600986 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700987 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800988 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600989 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700990 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800991 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600992 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700993 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800994 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600995 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700996 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800997 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600998 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001000 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001001 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001002 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001003 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001004 }
1005
1006 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001007 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001008 enumeratorString += string;
1009
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001010 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001011 enumeratorString += '|';
1012 }
1013 }
1014
1015 return enumeratorString;
1016}
1017
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1019 VkCommandPoolCreateFlagBits allFlags =
1020 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1021 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001022 return false;
1023 }
1024
1025 return true;
1026}
1027
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001028static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1029 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001030 return "unrecognized enumerator";
1031 }
1032
1033 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001035 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001036 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001037 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001038 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001039 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001040
1041 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001042 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001043 enumeratorString += string;
1044
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001045 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001046 enumeratorString += '|';
1047 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001048 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001049
1050 return enumeratorString;
1051}
1052
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001053static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001054 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001056 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001057 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001058
1059 return true;
1060}
1061
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001062static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1063 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001064 return "unrecognized enumerator";
1065 }
1066
1067 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001068 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001069 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 }
1071
1072 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001073 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001074 enumeratorString += string;
1075
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001076 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001077 enumeratorString += '|';
1078 }
1079 }
1080
1081 return enumeratorString;
1082}
1083
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001084static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1085 VkCommandBufferUsageFlags allFlags =
1086 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1087 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1088 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 return false;
1090 }
1091
1092 return true;
1093}
1094
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001095static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1096 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001097 return "unrecognized enumerator";
1098 }
1099
1100 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001101 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001102 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001103 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001104 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001105 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001106 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001107 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001108 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001109 }
1110
1111 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001112 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001113 enumeratorString += string;
1114
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001115 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001116 enumeratorString += '|';
1117 }
1118 }
1119
1120 return enumeratorString;
1121}
1122
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001123static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001124 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001126 return false;
1127 }
1128
1129 return true;
1130}
1131
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001132static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1133 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001134 return "unrecognized enumerator";
1135 }
1136
1137 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001138 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001139 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001140 }
1141
1142 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001143 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001144 enumeratorString += string;
1145
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001146 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001147 enumeratorString += '|';
1148 }
1149 }
1150
1151 return enumeratorString;
1152}
1153
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001154static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1155 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1156 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1157 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001158 return false;
1159 }
1160
1161 return true;
1162}
1163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001164static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1165 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001166 return "unrecognized enumerator";
1167 }
1168
1169 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001170 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001171 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001173 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001174 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001176 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001177 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001179 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001180 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1181 }
1182
1183 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001184 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001185 enumeratorString += string;
1186
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001187 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001188 enumeratorString += '|';
1189 }
1190 }
1191
1192 return enumeratorString;
1193}
1194
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001195static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001196 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001198 return false;
1199 }
1200
1201 return true;
1202}
1203
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001204static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1205 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001206 return "unrecognized enumerator";
1207 }
1208
1209 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001210 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001211 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001212 }
1213
1214 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001215 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001216 enumeratorString += string;
1217
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001218 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001219 enumeratorString += '|';
1220 }
1221 }
1222
1223 return enumeratorString;
1224}
1225
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001226static const int MaxParamCheckerStringLength = 256;
1227
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001228static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001229 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001230 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001231 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) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001240
1241 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1242 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1243 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001244 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001245 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1246 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1247 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001248 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001249 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001250}
1251
Dustin Gravesde628532016-04-21 16:30:17 -06001252static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1253 uint32_t index) {
1254 assert(device_data != nullptr);
1255 debug_report_data *report_data = device_data->report_data;
1256 bool skip_call = false;
1257
1258 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001259 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1260 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001261 } else {
1262 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1263 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1264 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001265 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1266 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001267 function_name, parameter_name, index);
1268 return false;
1269 }
1270 }
1271
1272 return skip_call;
1273}
1274
1275static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1276 const uint32_t count, const uint32_t *indices) {
1277 assert(device_data != nullptr);
1278 debug_report_data *report_data = device_data->report_data;
1279 bool skip_call = false;
1280
1281 if (indices != nullptr) {
1282 for (uint32_t i = 0; i < count; i++) {
1283 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001284 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1285 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001286 } else {
1287 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1288 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1289 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001290 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1291 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001292 function_name, parameter_name, i, indices[i]);
1293 return false;
1294 }
1295 }
1296 }
1297 }
1298
1299 return skip_call;
1300}
1301
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001302static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001304VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1305 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001306 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001307
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001308 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001309 assert(chain_info != nullptr);
1310 assert(chain_info->u.pLayerInfo != nullptr);
1311
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001312 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1313 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001314 if (fpCreateInstance == NULL) {
1315 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001316 }
1317
Dustin Graves842621d2016-03-03 14:17:08 -07001318 // Advance the link info for the next element on the chain
1319 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1320
1321 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001322
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001323 if (result == VK_SUCCESS) {
1324 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1325 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001326
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001327 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001328
Chia-I Wua570b7c2016-05-16 07:48:14 +08001329 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001330 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1331 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001332
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001333 // Look for one or more debug report create info structures
1334 // and setup a callback(s) for each one found.
1335 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1336 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1337 if (my_instance_data->num_tmp_callbacks > 0) {
1338 // Setup the temporary callback(s) here to catch early issues:
1339 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1340 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1341 // Failure of setting up one or more of the callback.
1342 // Therefore, clean up and don't use those callbacks:
1343 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1344 my_instance_data->num_tmp_callbacks = 0;
1345 }
1346 }
1347 }
1348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001349 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001350 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001351
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001352 // Ordinarily we'd check these before calling down the chain, but none of the layer
1353 // support is in place until now, if we survive we can report the issue now.
1354 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001355
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001356 if (pCreateInfo->pApplicationInfo) {
1357 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1358 validate_string(my_instance_data->report_data, "vkCreateInstance",
1359 "pCreateInfo->VkApplicationInfo->pApplicationName",
1360 pCreateInfo->pApplicationInfo->pApplicationName);
1361 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001362
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001363 if (pCreateInfo->pApplicationInfo->pEngineName) {
1364 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1365 pCreateInfo->pApplicationInfo->pEngineName);
1366 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001367 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001368
1369 // Disable the tmp callbacks:
1370 if (my_instance_data->num_tmp_callbacks > 0) {
1371 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1372 my_instance_data->tmp_callbacks);
1373 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001374 }
1375
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001376 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001377}
1378
Chia-I Wu01ca2372016-05-13 14:37:49 +08001379VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001380 // Grab the key before the instance is destroyed.
1381 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001382 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001383 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001384 assert(my_data != NULL);
1385
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001386 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1387 bool callback_setup = false;
1388 if (my_data->num_tmp_callbacks > 0) {
1389 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1390 my_data->tmp_callbacks)) {
1391 callback_setup = true;
1392 }
1393 }
1394
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001395 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001396
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001397 // Disable and cleanup the temporary callback(s):
1398 if (callback_setup) {
1399 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1400 }
1401 if (my_data->num_tmp_callbacks > 0) {
1402 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1403 my_data->num_tmp_callbacks = 0;
1404 }
1405
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001406 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001407 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001408 pTable->DestroyInstance(instance, pAllocator);
1409
1410 // Clean up logging callback, if any
1411 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001412 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1413 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001414 my_data->logging_callback.pop_back();
1415 }
1416
1417 layer_debug_report_destroy_instance(mid(instance));
1418 layer_data_map.erase(pTable);
1419
1420 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001421 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001422 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001423}
1424
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001425VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1426 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001427 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001428 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001429 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001430 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001431
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001432 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001434 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001435 result = get_dispatch_table(pc_instance_table_map, instance)
1436 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001437
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001438 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001439 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1440 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1441 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1442 // Save the supported features for each physical device
1443 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1444 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1445 }
1446 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001447 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001448 return result;
1449}
1450
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001451VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1452 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001453 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001455
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001456 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001457
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001458 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001460 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001461}
1462
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001463VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1464 VkFormatProperties *pFormatProperties) {
1465 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001466 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001467 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001468
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001469 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001470
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001471 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001472 get_dispatch_table(pc_instance_table_map, physicalDevice)
1473 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001474 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001475}
1476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001477VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1478 VkImageType type, VkImageTiling tiling,
1479 VkImageUsageFlags usage, VkImageCreateFlags flags,
1480 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001481 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001482 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001483 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001485
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001486 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1487 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001489 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001490 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1491 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1492 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001494 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001495 }
Chia-I Wu17241042015-10-31 00:31:16 +08001496
1497 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001498}
1499
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001500VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1501 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001502 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001503 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001504
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001505 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001507 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001508 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001509 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001510}
1511
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001512VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1513 uint32_t *pQueueFamilyPropertyCount,
1514 VkQueueFamilyProperties *pQueueFamilyProperties) {
1515 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001516 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001517 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001518
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001519 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1520 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001521
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001522 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001523 get_dispatch_table(pc_instance_table_map, physicalDevice)
1524 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001525 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001526}
1527
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001528VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1529 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1530 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001531 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001532 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001533
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001534 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001535
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001536 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001537 get_dispatch_table(pc_instance_table_map, physicalDevice)
1538 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001539 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001540}
1541
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001542void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1543 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001544 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001545
1546 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1547 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1548 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001549 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 -06001550 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001551 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1552 "structure.",
1553 i);
1554 } else {
1555 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001556 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001557
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001558 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1559 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1560 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1561 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001562 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 -06001563 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001564 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1565 "between 0 and 1. Actual value is %f",
1566 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1567 }
1568 }
1569 }
1570
1571 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1572 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001573 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001574 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001575 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1576 "of queue families.",
1577 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001578 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1579 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1580 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001581 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001582 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001583 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1584 "queues for the given family index.",
1585 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001586 }
Michael Lentine774704f2016-01-27 13:36:46 -06001587 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001588 }
1589}
1590
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001591static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001592 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001593
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001594 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001595
1596 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1597 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001598 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001599 }
1600#ifdef VK_USE_PLATFORM_XLIB_KHR
1601 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001602 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001603 }
1604#endif
1605#ifdef VK_USE_PLATFORM_XCB_KHR
1606 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001607 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001608 }
1609#endif
1610#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1611 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001612 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001613 }
1614#endif
1615#ifdef VK_USE_PLATFORM_MIR_KHR
1616 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001617 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001618 }
1619#endif
1620#ifdef VK_USE_PLATFORM_ANDROID_KHR
1621 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001622 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001623 }
1624#endif
1625#ifdef VK_USE_PLATFORM_WIN32_KHR
1626 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001627 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001628 }
1629#endif
1630 }
1631}
1632
1633static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1634 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1635 device_data->wsi_enabled = false;
1636
1637 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1638 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1639 device_data->wsi_enabled = true;
1640 }
1641 }
1642}
1643
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001644void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001645 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001646
1647 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1648 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1649 my_device_data->queueFamilyIndexMap.insert(
1650 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1651 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001652 }
1653}
1654
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001655VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001656 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001657 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001658 * NOTE: We do not validate physicalDevice or any dispatchable
1659 * object as the first parameter. We couldn't get here if it was wrong!
1660 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001661
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001662 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001663 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001664 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001665 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001666
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001667 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001668
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001669 if (pCreateInfo != NULL) {
1670 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001671 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001672 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1673 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001674 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001675 }
Michael Lentine774704f2016-01-27 13:36:46 -06001676
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001677 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001678 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001679 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1680 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001681 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001682 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001683 }
1684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001685 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001686 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001687 assert(chain_info != nullptr);
1688 assert(chain_info->u.pLayerInfo != nullptr);
1689
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001690 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1691 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001692 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001693 if (fpCreateDevice == NULL) {
1694 return VK_ERROR_INITIALIZATION_FAILED;
1695 }
1696
1697 // Advance the link info for the next element on the chain
1698 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1699
1700 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001701
1702 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1703
1704 if (result == VK_SUCCESS) {
1705 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1706 assert(my_device_data != nullptr);
1707
1708 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1709 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1710
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001711 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1712
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001713 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001714 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1715 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001716 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001717 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001718
1719 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1720 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001721
1722 // Query and save physical device limits for this device
1723 VkPhysicalDeviceProperties device_properties = {};
1724 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1725 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001726 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001727
1728 // Save app-enabled features in this device's layer_data structure
1729 if (pCreateInfo->pEnabledFeatures) {
1730 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1731 } else {
1732 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1733 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001734 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001735 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001736
Jeremy Hayes99a96322015-06-26 12:48:09 -06001737 return result;
1738}
1739
Chia-I Wu01ca2372016-05-13 14:37:49 +08001740VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001741 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001742 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001743 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1744 assert(my_data != NULL);
1745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001746 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001748 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001749 layer_debug_report_destroy_device(device);
1750
Jeremy Hayes99a96322015-06-26 12:48:09 -06001751#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001752 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001753#endif
1754
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001755 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001756 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001757 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001758 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001759}
1760
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001761bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001762 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001763 assert(my_device_data != nullptr);
1764
Dustin Gravesde628532016-04-21 16:30:17 -06001765 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001766
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001767 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001768 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001769 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 -06001770 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1772 "was created.",
1773 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001774 return false;
1775 }
1776 return true;
1777}
1778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001779VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1780 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001781 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001782 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001783
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001784 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001786 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001787 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1788
1789 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001790 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001791}
1792
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001793VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001794 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001795 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001796 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001797 assert(my_data != NULL);
1798
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001799 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001800
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001801 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001802 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1803
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001804 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001805 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001806
Jeremy Hayes99a96322015-06-26 12:48:09 -06001807 return result;
1808}
1809
Chia-I Wu01ca2372016-05-13 14:37:49 +08001810VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1812 assert(my_data != NULL);
1813
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001814 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001815
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001816 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817
1818 return result;
1819}
1820
Chia-I Wu01ca2372016-05-13 14:37:49 +08001821VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001822 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1823 assert(my_data != NULL);
1824
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001825 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001826
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001827 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001828
1829 return result;
1830}
1831
Chia-I Wu01ca2372016-05-13 14:37:49 +08001832VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001833 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001834 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001835 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001836 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001837 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001839 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001840
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001841 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1843
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001844 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001845 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001846
1847 return result;
1848}
1849
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001850VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1851 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001852 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001853 assert(my_data != NULL);
1854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001855 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001856
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001857 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001858 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001859 }
1860}
1861
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001862VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1863 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001864 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001865 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001866 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001867 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001868
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001869 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001870
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001871 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1873
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001874 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001875 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001876
1877 return result;
1878}
1879
Chia-I Wu01ca2372016-05-13 14:37:49 +08001880VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001881 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001882 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1883 assert(my_data != NULL);
1884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001885 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001886
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001887 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001888 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1889 }
1890}
1891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001892VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1893 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001894 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001895 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001896 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001897 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001898
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001899 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001900
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001901 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001902 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1903
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001904 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001905 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001906
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001907 return result;
1908}
1909
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001910VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1911 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001912 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001913 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001914 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001915 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001916
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001917 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001918
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001919 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001920 result =
1921 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001922
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001923 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001924 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001925
Tony Barbourb1250542015-04-16 19:23:13 -06001926 return result;
1927}
1928
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001929VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1930 VkDeviceSize *pCommittedMemoryInBytes) {
1931 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001932 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001933 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001935 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001936
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001937 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001938 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001939 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001940}
1941
Chia-I Wu01ca2372016-05-13 14:37:49 +08001942VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1943 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001944 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001945 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001946 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1947 assert(my_data != NULL);
1948
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001949 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001950
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001951 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001952 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1953
1954 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1955 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001956
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001957 return result;
1958}
1959
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001960VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001961 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001962 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001963 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1964 assert(my_data != NULL);
1965
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001966 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001967
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001968 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001969 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1970
1971 validate_result(my_data->report_data, "vkBindImageMemory", result);
1972 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001973
1974 return result;
1975}
1976
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001977VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1978 VkMemoryRequirements *pMemoryRequirements) {
1979 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001981 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001982
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001983 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001984
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001985 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001986 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001987 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001988}
1989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001990VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1991 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001992 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001995 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001996
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001997 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001998 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002000}
2001
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002002bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2003 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2004 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002005 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2007 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002008 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 -06002009 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002010 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2011 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002012 return false;
2013 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002014 }
2015
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002016 return true;
2017}
2018
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002019VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2020 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2021 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002022 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002023 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002025 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2026 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002027
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002028 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002029 get_dispatch_table(pc_device_table_map, device)
2030 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002031
2032 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2033 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002034}
2035
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002036bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2037 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2038 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002039 if (pProperties != nullptr) {
2040 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2041 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002042 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 -06002043 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2045 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002046 return false;
2047 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002048 }
2049
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002050 return true;
2051}
2052
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002053VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2054 VkImageType type, VkSampleCountFlagBits samples,
2055 VkImageUsageFlags usage, VkImageTiling tiling,
2056 uint32_t *pPropertyCount,
2057 VkSparseImageFormatProperties *pProperties) {
2058 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002059 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002060 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002061
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002062 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2063 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002065 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002066 get_dispatch_table(pc_instance_table_map, physicalDevice)
2067 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2068 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002069
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2071 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002072 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002073}
2074
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002075VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2076 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002077 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002078 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002079 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002080 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002082 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002084 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002085 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2086
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002087 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002088 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002089
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002090 return result;
2091}
2092
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002093VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2094 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002095 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002096 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002097 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002098 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002099
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002100 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002101
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002102 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002103 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2104
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002105 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002106 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002107
2108 return result;
2109}
2110
Chia-I Wu01ca2372016-05-13 14:37:49 +08002111VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002112 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002113 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002114 assert(my_data != NULL);
2115
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002116 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002117
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002118 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002119 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002120 }
2121}
2122
Chia-I Wu01ca2372016-05-13 14:37:49 +08002123VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002124 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002125 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002126 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002127 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002129 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002130
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002131 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002132 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2133
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002134 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002135 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002136
2137 return result;
2138}
2139
Chia-I Wu01ca2372016-05-13 14:37:49 +08002140VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002141 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002142 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002143 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2144 assert(my_data != NULL);
2145
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002146 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002147
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002148 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002149 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2150
2151 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2152 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002153
2154 return result;
2155}
2156
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002157VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2158 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002159 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002160 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002162 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002163
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002164 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002165
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002166 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002167 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2168
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002169 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002170 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002171
2172 return result;
2173}
2174
Chia-I Wu01ca2372016-05-13 14:37:49 +08002175VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002176 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002177 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002178 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002179 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002180 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002181
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002182 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002183
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002184 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002185 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2186
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002187 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002188 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002189
2190 return result;
2191}
2192
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002193VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2194 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002195 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002196 assert(my_data != NULL);
2197
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002198 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002199
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002200 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002201 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002202 }
2203}
2204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002205VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2206 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002207 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002208 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002209 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002210 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002211
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002212 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002213
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002214 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002215 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2216
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002217 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002218 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002219
2220 return result;
2221}
2222
Chia-I Wu01ca2372016-05-13 14:37:49 +08002223VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002224 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002225 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002226 assert(my_data != NULL);
2227
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002228 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002229
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002230 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002231 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002232 }
2233}
2234
Chia-I Wu01ca2372016-05-13 14:37:49 +08002235VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002236 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002237 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002238 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2239 assert(my_data != NULL);
2240
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002241 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002243 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002244 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2245
2246 validate_result(my_data->report_data, "vkGetEventStatus", result);
2247 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002248
2249 return result;
2250}
2251
Chia-I Wu01ca2372016-05-13 14:37:49 +08002252VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002253 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002254 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002255 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2256 assert(my_data != NULL);
2257
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002258 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002259
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002260 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002261 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2262
2263 validate_result(my_data->report_data, "vkSetEvent", result);
2264 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002265
2266 return result;
2267}
2268
Chia-I Wu01ca2372016-05-13 14:37:49 +08002269VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002270 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002271 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002272 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2273 assert(my_data != NULL);
2274
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002275 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002276
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002277 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002278 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2279
2280 validate_result(my_data->report_data, "vkResetEvent", result);
2281 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002282
2283 return result;
2284}
2285
Chia-I Wu01ca2372016-05-13 14:37:49 +08002286VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002287 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002288 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002289 bool skip_call = false;
2290 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2291 assert(device_data != nullptr);
2292 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002293
Dustin Gravesc900f572016-05-16 11:07:59 -06002294 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002295
Dustin Gravesc900f572016-05-16 11:07:59 -06002296 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2297 if (pCreateInfo != nullptr) {
2298 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2299 // VkQueryPipelineStatisticFlagBits values
2300 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2301 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2302 skip_call |=
2303 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2304 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2305 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2306 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2307 }
2308 }
2309
2310 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002311 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2312
Dustin Gravesc900f572016-05-16 11:07:59 -06002313 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002314 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002315
2316 return result;
2317}
2318
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002319VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2320 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002321 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002322 assert(my_data != NULL);
2323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002324 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002325
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002326 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002328 }
2329}
2330
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002331VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2332 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002333 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002334 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002335 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002336 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002337
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002338 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2339 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002340
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002341 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002342 result = get_dispatch_table(pc_device_table_map, device)
2343 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002344
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002345 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002346 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002347
2348 return result;
2349}
2350
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002351VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2352 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002353 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002354 bool skip_call = false;
2355 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2356 assert(device_data != nullptr);
2357 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002358
Dustin Gravesc900f572016-05-16 11:07:59 -06002359 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002360
Dustin Gravesc900f572016-05-16 11:07:59 -06002361 if (pCreateInfo != nullptr) {
2362 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2363 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2364 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2365 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2366 skip_call |=
2367 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2368 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2369 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2370 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002371
Dustin Gravesc900f572016-05-16 11:07:59 -06002372 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2373 // queueFamilyIndexCount uint32_t values
2374 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2375 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2376 __LINE__, REQUIRED_PARAMETER, LayerName,
2377 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2378 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2379 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2380 }
2381
2382 // Ensure that the queue family indices were specified at device creation
2383 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2384 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2385 }
2386 }
2387
2388 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002389 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2390
Dustin Gravesc900f572016-05-16 11:07:59 -06002391 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002392 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002393
2394 return result;
2395}
2396
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002397VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2398 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002399 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002400 assert(my_data != NULL);
2401
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002402 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002403
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002404 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002405 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002406 }
2407}
2408
Chia-I Wu01ca2372016-05-13 14:37:49 +08002409VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2410 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002411 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002412 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002413 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002414 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002415
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002416 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002418 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002419 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2420
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002421 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002422 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002423
2424 return result;
2425}
2426
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002427VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2428 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002429 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002430 assert(my_data != NULL);
2431
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002432 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002434 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002435 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002436 }
2437}
2438
Chia-I Wu01ca2372016-05-13 14:37:49 +08002439VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2440 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002441 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2442 bool skip_call = false;
2443 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002444 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002445 debug_report_data *report_data = device_data->report_data;
2446
2447 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2448
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002449 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002450 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002451 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002452 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2453 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2454 skip_call |=
2455 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2456 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2457 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2458 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002459
Dustin Gravesc900f572016-05-16 11:07:59 -06002460 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2461 // queueFamilyIndexCount uint32_t values
2462 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2463 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2464 __LINE__, REQUIRED_PARAMETER, LayerName,
2465 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2466 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2467 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2468 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002469
2470 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2471 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2472 }
2473
2474 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002475 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2476 skip_call |=
2477 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2478 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002479
2480 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002481 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002482
2483 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002484 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002485
2486 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2487 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2488 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2489 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002490 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002491 }
2492
2493 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2494 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2495 // extent.height must be equal
2496 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2497 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002498 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2499 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2500 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2501 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002502 }
2503
2504 if (pCreateInfo->extent.depth != 1) {
2505 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002506 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002507 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2508 }
2509 }
2510
2511 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2512 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2513 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002514 skip_call |=
2515 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2516 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2517 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002518 }
2519
2520 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2521 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2522 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2523 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002524 skip_call |=
2525 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2526 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2527 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002528 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002529 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002530
Dustin Gravesf8032f22016-05-11 18:31:44 -06002531 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002532 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2533
Dustin Gravesf8032f22016-05-11 18:31:44 -06002534 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002535 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002536
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002537 return result;
2538}
2539
Chia-I Wu01ca2372016-05-13 14:37:49 +08002540VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002541 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002542 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002543 assert(my_data != NULL);
2544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002545 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002546
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002547 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002548 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002549 }
2550}
2551
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002552bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2553 if (pSubresource != nullptr) {
2554 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2555 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002556 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 -06002557 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002558 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2559 return false;
2560 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002561 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002562
2563 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002564}
2565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002566VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2567 VkSubresourceLayout *pLayout) {
2568 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002569 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002570 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002571
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002572 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002573
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002574 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002575 PreGetImageSubresourceLayout(device, pSubresource);
2576
2577 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002578 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002579}
2580
Chia-I Wu01ca2372016-05-13 14:37:49 +08002581VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2582 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002583 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002584 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002585 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002586 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002587 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002588
Dustin Graves0b70a632016-04-27 17:44:56 -06002589 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002590
Dustin Graves0b70a632016-04-27 17:44:56 -06002591 if (pCreateInfo != nullptr) {
2592 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002593 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2594 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002595 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2596 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2597 "pCreateInfo->subresourceRange.layerCount must be 1",
2598 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2599 }
2600 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002601 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2602 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2603 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002604 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2605 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2606 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2607 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2608 }
2609 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002610 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2611 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002612 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2613 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2614 "pCreateInfo->subresourceRange.layerCount must be 6");
2615 }
2616 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002617 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2618 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002619 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2620 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2621 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2622 }
2623 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2624 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2625 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2626 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2627 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2628 }
2629
Dustin Graves2a80dc62016-07-12 13:57:02 -06002630 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2631 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002632 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2633 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2634 "pCreateInfo->subresourceRange.layerCount must be 1");
2635 }
2636 }
2637 }
2638
2639 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002640 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2641
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002642 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002643 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002644
2645 return result;
2646}
2647
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002648VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2649 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002650 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002651 assert(my_data != NULL);
2652
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002653 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002654
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002655 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002656 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002657 }
2658}
2659
Chia-I Wu01ca2372016-05-13 14:37:49 +08002660VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002661 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002662 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002663 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002664 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665 assert(my_data != NULL);
2666
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002667 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002669 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002670 result =
2671 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002672
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002673 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002674 }
2675
Michael Lentine03d8e572015-09-15 14:59:14 -05002676 return result;
2677}
2678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002679VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2680 const VkAllocationCallbacks *pAllocator) {
2681 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002683 assert(my_data != NULL);
2684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002685 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002686
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002687 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002689 }
2690}
2691
Chia-I Wu01ca2372016-05-13 14:37:49 +08002692VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002693 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002694 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002695 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002696 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002697 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002698
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002699 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002700
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002701 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002702 result =
2703 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002704
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002705 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002706 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002707
2708 return result;
2709}
2710
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002711VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2712 const VkAllocationCallbacks *pAllocator) {
2713 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002715 assert(my_data != NULL);
2716
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002717 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002718
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002719 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002721 }
2722}
2723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002724VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2725 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002726 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002727 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002728 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002729 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002731 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002732
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002733 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002734 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2735
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002736 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002737 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002738
2739 return result;
2740}
2741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002742VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2743 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002744 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002745 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002746 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002747 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002749 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002751 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2753
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002754 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002756
2757 return result;
2758}
2759
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002760bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002761 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2762
2763 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 if (pCreateInfos != nullptr) {
2765 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2766 if (pCreateInfos->basePipelineIndex != -1) {
2767 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002768 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 -06002769 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002770 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2771 "pCreateInfos->flags "
2772 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2773 return false;
2774 }
2775 }
2776
2777 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2778 if (pCreateInfos->basePipelineIndex != -1) {
2779 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002780 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002781 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2783 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2784 "VK_NULL_HANDLE");
2785 return false;
2786 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002787 }
2788 }
2789
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002790 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002791 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002792 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 -06002793 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002794 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2795 "unrecognized enumerator");
2796 return false;
2797 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002798
2799 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2800 (data->physical_device_features.fillModeNonSolid == false)) {
2801 log_msg(
2802 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2803 DEVICE_FEATURE, LayerName,
2804 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2805 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2806 return false;
2807 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002808 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002809
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002810 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002811 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002812 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2813 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002814 pCreateInfos[i].pStages[j].pName);
2815 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002816 }
2817
2818 return true;
2819}
2820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002821VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2822 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2823 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002824 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002825 bool skip_call = false;
2826 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2827 assert(device_data != nullptr);
2828 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002829
Dustin Gravesc900f572016-05-16 11:07:59 -06002830 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2831 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002832
Dustin Gravesc900f572016-05-16 11:07:59 -06002833 if (pCreateInfos != nullptr) {
2834 for (uint32_t i = 0; i < createInfoCount; ++i) {
2835 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2836 if (pCreateInfos[i].pTessellationState == nullptr) {
2837 if (pCreateInfos[i].pStages != nullptr) {
2838 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2839 // pTessellationState must not be NULL
2840 bool has_control = false;
2841 bool has_eval = false;
2842
2843 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2844 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2845 has_control = true;
2846 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2847 has_eval = true;
2848 }
2849 }
2850
2851 if (has_control && has_eval) {
2852 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2853 __LINE__, REQUIRED_PARAMETER, LayerName,
2854 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2855 "control shader stage and a tessellation evaluation shader stage, "
2856 "pCreateInfos[%d].pTessellationState must not be NULL",
2857 i, i);
2858 }
2859 }
Dustin Graves629259b2016-05-30 16:14:27 -06002860 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002861 skip_call |= validate_struct_pnext(
2862 report_data, "vkCreateGraphicsPipelines",
2863 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2864 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002865
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002866 skip_call |= validate_reserved_flags(
2867 report_data, "vkCreateGraphicsPipelines",
2868 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2869 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002870
2871 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2872 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2873 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2874 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2875 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2876 i);
2877 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002878 }
2879
2880 if (pCreateInfos[i].pViewportState == nullptr) {
2881 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2882 // valid VkPipelineViewportStateCreateInfo structure
2883 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2884 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2885 skip_call |= log_msg(
2886 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2887 REQUIRED_PARAMETER, LayerName,
2888 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2889 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2890 i, i);
2891 }
2892 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002893 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002894 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2895 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2896 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002897
2898 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002899 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2900 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002901 pCreateInfos[i].pViewportState->flags);
2902
Dustin Gravesc900f572016-05-16 11:07:59 -06002903 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2904 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2905 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2906 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2907 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2908 i);
2909 }
2910
2911 if (pCreateInfos[i].pDynamicState != nullptr) {
2912 bool has_dynamic_viewport = false;
2913 bool has_dynamic_scissor = false;
2914
2915 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2916 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2917 has_dynamic_viewport = true;
2918 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2919 has_dynamic_scissor = true;
2920 }
2921 }
2922
2923 // viewportCount must be greater than 0
2924 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2925 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2926 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2927 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002928 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2929 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002930 "must be greater than 0",
2931 i, i);
2932 }
2933
2934 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2935 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2936 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2937 skip_call |=
2938 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2939 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002940 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002941 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2942 i, i);
2943 }
2944
2945 // scissorCount must be greater than 0
2946 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2947 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2948 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2949 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002950 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2951 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002952 "must be greater than 0",
2953 i, i);
2954 }
2955
2956 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2957 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2958 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2959 skip_call |=
2960 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2961 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002962 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002963 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2964 i, i);
2965 }
2966 }
2967 }
2968
2969 if (pCreateInfos[i].pMultisampleState == nullptr) {
2970 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2971 // a valid VkPipelineMultisampleStateCreateInfo structure
2972 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2973 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2974 skip_call |=
2975 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2976 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2977 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2978 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2979 i, i);
2980 }
Dustin Graves629259b2016-05-30 16:14:27 -06002981 } else {
2982 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002983 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2984 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002985 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002986
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002987 skip_call |= validate_reserved_flags(
2988 report_data, "vkCreateGraphicsPipelines",
2989 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2990 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002991
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002992 skip_call |= validate_bool32(
2993 report_data, "vkCreateGraphicsPipelines",
2994 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
2995 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002996
2997 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002998 report_data, "vkCreateGraphicsPipelines",
2999 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3000 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3001 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3002 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003003
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003004 skip_call |= validate_bool32(
3005 report_data, "vkCreateGraphicsPipelines",
3006 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3007 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003008
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003009 skip_call |= validate_bool32(
3010 report_data, "vkCreateGraphicsPipelines",
3011 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3012 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003013
3014 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3015 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3016 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3017 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3018 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3019 i);
3020 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003021 }
3022
3023 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003024 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003025 skip_call |= validate_struct_pnext(
3026 report_data, "vkCreateGraphicsPipelines",
3027 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3028 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003029
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003030 skip_call |= validate_reserved_flags(
3031 report_data, "vkCreateGraphicsPipelines",
3032 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3033 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003034
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003035 skip_call |= validate_bool32(
3036 report_data, "vkCreateGraphicsPipelines",
3037 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3038 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003039
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003040 skip_call |= validate_bool32(
3041 report_data, "vkCreateGraphicsPipelines",
3042 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3043 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003044
3045 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003046 report_data, "vkCreateGraphicsPipelines",
3047 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3048 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3049 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003050
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003051 skip_call |= validate_bool32(
3052 report_data, "vkCreateGraphicsPipelines",
3053 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3054 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003055
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003056 skip_call |= validate_bool32(
3057 report_data, "vkCreateGraphicsPipelines",
3058 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3059 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003060
3061 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003062 report_data, "vkCreateGraphicsPipelines",
3063 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3064 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3065 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003066
3067 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003068 report_data, "vkCreateGraphicsPipelines",
3069 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3070 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3071 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003072
3073 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003074 report_data, "vkCreateGraphicsPipelines",
3075 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3076 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3077 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003078
3079 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003080 report_data, "vkCreateGraphicsPipelines",
3081 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3082 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3083 pCreateInfos[i].pDepthStencilState->front.compareOp);
3084
3085 skip_call |= validate_ranged_enum(
3086 report_data, "vkCreateGraphicsPipelines",
3087 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003088 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3089
3090 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003091 report_data, "vkCreateGraphicsPipelines",
3092 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003093 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3094
3095 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003096 report_data, "vkCreateGraphicsPipelines",
3097 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3098 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3099 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003100
3101 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003102 report_data, "vkCreateGraphicsPipelines",
3103 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3104 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3105 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003106
3107 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3108 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3109 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3110 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3111 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3112 i);
3113 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003114 }
3115
3116 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3117 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003118 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003119 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3120 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3121 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003122
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003123 skip_call |= validate_reserved_flags(
3124 report_data, "vkCreateGraphicsPipelines",
3125 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3126 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003127
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003128 skip_call |= validate_bool32(
3129 report_data, "vkCreateGraphicsPipelines",
3130 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3131 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003132
3133 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003134 report_data, "vkCreateGraphicsPipelines",
3135 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3136 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3137 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003138
3139 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3140 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3141 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003142 skip_call |=
3143 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3144 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3145 ParameterName::IndexVector{i, attachmentIndex}),
3146 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003147
3148 skip_call |= validate_ranged_enum(
3149 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003150 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3151 ParameterName::IndexVector{i, attachmentIndex}),
3152 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003153 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3154
3155 skip_call |= validate_ranged_enum(
3156 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003157 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3158 ParameterName::IndexVector{i, attachmentIndex}),
3159 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003160 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3161
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003162 skip_call |=
3163 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3164 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3165 ParameterName::IndexVector{i, attachmentIndex}),
3166 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3167 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003168
3169 skip_call |= validate_ranged_enum(
3170 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003171 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3172 ParameterName::IndexVector{i, attachmentIndex}),
3173 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003174 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3175
3176 skip_call |= validate_ranged_enum(
3177 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003178 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3179 ParameterName::IndexVector{i, attachmentIndex}),
3180 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003181 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3182
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003183 skip_call |=
3184 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3185 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3186 ParameterName::IndexVector{i, attachmentIndex}),
3187 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3188 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003189
3190 skip_call |=
3191 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003192 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3193 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003194 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3195 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3196 }
3197 }
3198
Dustin Gravesc900f572016-05-16 11:07:59 -06003199 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3200 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3201 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3202 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3203 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3204 i);
3205 }
3206
3207 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3208 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3209 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003210 report_data, "vkCreateGraphicsPipelines",
3211 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003212 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3213 }
3214 }
3215 }
3216 }
3217
3218 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003219 PreCreateGraphicsPipelines(device, pCreateInfos);
3220
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003221 result = get_dispatch_table(pc_device_table_map, device)
3222 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003223
Dustin Gravesc900f572016-05-16 11:07:59 -06003224 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003225 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003226
3227 return result;
3228}
3229
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003230bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003231 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3232
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003233 if (pCreateInfos != nullptr) {
3234 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003235 uint32_t i = 0;
3236 validate_string(data->report_data, "vkCreateComputePipelines",
3237 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003238 }
3239
3240 return true;
3241}
3242
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003243VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3244 const VkComputePipelineCreateInfo *pCreateInfos,
3245 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003246 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003247 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003248 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003249 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003250
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003251 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3252 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003253
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003254 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003255 PreCreateComputePipelines(device, pCreateInfos);
3256
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003257 result = get_dispatch_table(pc_device_table_map, device)
3258 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003259
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003260 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003261 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003262
3263 return result;
3264}
3265
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003266VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3267 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003268 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003269 assert(my_data != NULL);
3270
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003271 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003272
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003273 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003274 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003275 }
3276}
3277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003278VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3279 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003280 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003281 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003282 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003283 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003284
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003285 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003286
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003287 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003288 result =
3289 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003290
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003291 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003292 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003293
3294 return result;
3295}
3296
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003297VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3298 const VkAllocationCallbacks *pAllocator) {
3299 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003300 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003301 assert(my_data != NULL);
3302
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003303 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003305 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003306 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003307 }
3308}
3309
Chia-I Wu01ca2372016-05-13 14:37:49 +08003310VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3311 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003312 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003313 bool skip_call = false;
3314 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3315 assert(device_data != NULL);
3316 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003317
Dustin Gravesc900f572016-05-16 11:07:59 -06003318 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003319
Dustin Gravesc900f572016-05-16 11:07:59 -06003320 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3321 if (pCreateInfo != nullptr) {
3322 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3323 if (pCreateInfo->compareEnable == VK_TRUE) {
3324 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3325 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3326 }
3327
3328 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3329 // valid VkBorderColor value
3330 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3331 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3332 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3333 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3334 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3335 }
3336 }
3337
3338 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003339 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3340
Dustin Gravesc900f572016-05-16 11:07:59 -06003341 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003342 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003343
3344 return result;
3345}
3346
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003347VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3348 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003349 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003350 assert(my_data != NULL);
3351
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003352 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003353
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003354 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003355 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003356 }
3357}
3358
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003359VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3360 const VkAllocationCallbacks *pAllocator,
3361 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003362 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003363 bool skip_call = false;
3364 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3365 assert(device_data != nullptr);
3366 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003367
Dustin Gravesc900f572016-05-16 11:07:59 -06003368 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003369
Dustin Gravesc900f572016-05-16 11:07:59 -06003370 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3371 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3372 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3373 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3374 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3375 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3376 // valid VkSampler handles
3377 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3378 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3379 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3380 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3381 ++descriptor_index) {
3382 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3383 skip_call |=
3384 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3385 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3386 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3387 " specified as VK_NULL_HANDLE",
3388 i, descriptor_index);
3389 }
3390 }
3391 }
3392
3393 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3394 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3395 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3396 skip_call |=
3397 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3398 UNRECOGNIZED_VALUE, LayerName,
3399 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3400 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3401 i, i);
3402 }
3403 }
3404 }
3405 }
3406
3407 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003408 result =
3409 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003410
Dustin Gravesc900f572016-05-16 11:07:59 -06003411 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003412 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003413
3414 return result;
3415}
3416
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003417VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3418 const VkAllocationCallbacks *pAllocator) {
3419 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003421 assert(my_data != NULL);
3422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003423 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003425 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003426 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003427 }
3428}
3429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003430VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3431 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003432 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003433 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003434 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003435 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003437 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003438
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003439 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003441 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003442 result =
3443 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003444
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003445 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003446 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003447
3448 return result;
3449}
3450
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003451VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3452 const VkAllocationCallbacks *pAllocator) {
3453 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003455 assert(my_data != NULL);
3456
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003457 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003459 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003460 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003461 }
3462}
3463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003464VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3465 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003466 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003467 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003468 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3469 assert(my_data != NULL);
3470
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003471 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003472
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003473 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003474 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3475
3476 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3477 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003478
3479 return result;
3480}
3481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003482VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3483 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003484 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003485 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003487 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003489 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003491 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003492 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3493
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003494 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003495 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003496
3497 return result;
3498}
3499
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003500VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003501 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003502 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003503 bool skip_call = false;
3504 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3505 assert(device_data != nullptr);
3506 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003507
Dustin Gravesc900f572016-05-16 11:07:59 -06003508 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003509
Dustin Gravesc900f572016-05-16 11:07:59 -06003510 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3511 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3512 // validate_array()
3513 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3514 pDescriptorSets, true, true);
3515
3516 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003517 result = get_dispatch_table(pc_device_table_map, device)
3518 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003519
Dustin Gravesc900f572016-05-16 11:07:59 -06003520 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003521 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003522
3523 return result;
3524}
3525
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003526VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3527 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3528 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003529 bool skip_call = false;
3530 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3531 assert(device_data != NULL);
3532 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003533
Dustin Gravesc900f572016-05-16 11:07:59 -06003534 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3535 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003536
Dustin Gravesc900f572016-05-16 11:07:59 -06003537 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3538 if (pDescriptorWrites != NULL) {
3539 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3540 // descriptorCount must be greater than 0
3541 if (pDescriptorWrites[i].descriptorCount == 0) {
3542 skip_call |=
3543 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3544 REQUIRED_PARAMETER, LayerName,
3545 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3546 }
3547
3548 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3549 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3550 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3551 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3552 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3553 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3554 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3555 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3556 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3557 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3558 __LINE__, REQUIRED_PARAMETER, LayerName,
3559 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3560 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3561 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3562 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3563 i, i);
3564 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3565 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3566 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3567 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3568 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3569 ++descriptor_index) {
3570 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003571 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3572 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003573 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3574 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003575 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3576 ParameterName::IndexVector{i, descriptor_index}),
3577 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003578 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3579 }
3580 }
3581 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3582 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3583 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3584 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3585 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3586 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3587 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3588 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3589 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3590 __LINE__, REQUIRED_PARAMETER, LayerName,
3591 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3592 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3593 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3594 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3595 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003596 } else {
3597 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3598 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003599 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3600 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003601 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3602 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003603 }
3604 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3605 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3606 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3607 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3608 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3609 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3610 __LINE__, REQUIRED_PARAMETER, LayerName,
3611 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3612 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3613 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3614 i, i);
3615 } else {
3616 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3617 ++descriptor_index) {
3618 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003619 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3620 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003621 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3622 }
3623 }
3624 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003625
3626 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3627 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3628 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3629 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3630 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3631 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3632 skip_call |=
3633 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003634 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003635 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3636 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3637 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3638 }
3639 }
3640 }
3641 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3642 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3643 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3644 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3645 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3646 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3647 skip_call |=
3648 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003649 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003650 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3651 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3652 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3653 }
3654 }
3655 }
3656 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003657 }
3658 }
3659
3660 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003661 get_dispatch_table(pc_device_table_map, device)
3662 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003663 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003664}
3665
Chia-I Wu01ca2372016-05-13 14:37:49 +08003666VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003667 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003668 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003669 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003671 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003673 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003674
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003675 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003676 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3677
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003678 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003679 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003680
3681 return result;
3682}
3683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003684VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3685 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003687 assert(my_data != NULL);
3688
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003689 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003690
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003691 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003692 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003693 }
3694}
3695
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003696bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3697 bool skip_call = false;
3698 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3699
3700 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3701 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3702 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 -06003703 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003704 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3705 }
3706 }
3707 return skip_call;
3708}
3709
Chia-I Wu01ca2372016-05-13 14:37:49 +08003710VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003711 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003712 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003713 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003715 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003716
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003717 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3718 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003719
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003720 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003721 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3722
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003723 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003724 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003725
3726 return result;
3727}
3728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003729VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3730 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003731 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003732 assert(my_data != NULL);
3733
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003734 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003735
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003736 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003737 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003738 }
3739}
3740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003741VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3742 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003744 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003746 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003748 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003749 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003750 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003751}
3752
Chia-I Wu01ca2372016-05-13 14:37:49 +08003753VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003754 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003755 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003756 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003757 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003758 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003760 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003761 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003762
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003763 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003764
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003765 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003766 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3767
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003768 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003769 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003770
3771 return result;
3772}
3773
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003774VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3775 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003776 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003777 assert(my_data != NULL);
3778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003779 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003780
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003781 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003782 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003783 }
3784}
3785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003786VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003787 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003788 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003789 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3790 assert(my_data != NULL);
3791
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003792 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003793
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003794 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003795 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3796
3797 validate_result(my_data->report_data, "vkResetCommandPool", result);
3798 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003799
3800 return result;
3801}
3802
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003803VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3804 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003805 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003806 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003807 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003808 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003809
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003810 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003811
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003812 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003813 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3814
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003815 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003816 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003817
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003818 return result;
3819}
3820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003821VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003822 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003823 bool skip_call = false;
3824 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3825 assert(device_data != nullptr);
3826 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003827
Dustin Gravesc900f572016-05-16 11:07:59 -06003828 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003829
Dustin Gravesc900f572016-05-16 11:07:59 -06003830 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3831 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3832 // validate_array()
3833 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3834 pCommandBuffers, true, true);
3835
3836 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003837 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003838 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003839 }
3840}
3841
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003842bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3843 bool skip_call = false;
3844 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3845 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3846
3847 if (pInfo != NULL) {
3848 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3849 skip_call |=
3850 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 -06003851 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003852 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3853 "inheritedQueries.");
3854 }
3855
3856 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3857 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3858 skip_call |=
3859 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 -06003860 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003861 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3862 "valid combination of VkQueryControlFlagBits.",
3863 pInfo->queryFlags);
3864 }
3865 }
3866 return skip_call;
3867}
3868
3869VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003870 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003871 bool skip_call = false;
3872 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3873 assert(device_data != nullptr);
3874 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003875
Dustin Gravesc900f572016-05-16 11:07:59 -06003876 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003877
Dustin Gravesc900f572016-05-16 11:07:59 -06003878 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3879 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3880 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3881 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3882 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3883
3884 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003885 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003886 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003887
3888 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3889 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3890
Dustin Gravesc900f572016-05-16 11:07:59 -06003891 // TODO: This only needs to be validated when the inherited queries feature is enabled
3892 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3893 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3894
3895 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3896 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3897 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3898 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3899 }
3900
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003901 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3902
Dustin Gravesc900f572016-05-16 11:07:59 -06003903 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003904 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3905
Dustin Gravesc900f572016-05-16 11:07:59 -06003906 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003907 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003908
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003909 return result;
3910}
3911
Chia-I Wu01ca2372016-05-13 14:37:49 +08003912VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3914 assert(my_data != NULL);
3915
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003916 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003918 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003920 return result;
3921}
3922
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003923VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003924 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003925 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3926 assert(my_data != NULL);
3927
Dustin Graves16d18972016-05-09 17:36:57 -06003928 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003929
Dustin Graves16d18972016-05-09 17:36:57 -06003930 if (!skip_call) {
3931 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3932
3933 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3934 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003936 return result;
3937}
3938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003939VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3940 VkPipeline pipeline) {
3941 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003942 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3943 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003944
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003945 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003947 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003948 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3949 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003950}
3951
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003952VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3953 const VkViewport *pViewports) {
3954 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003956 assert(my_data != NULL);
3957
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003958 skip_call |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003959
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003960 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003961 get_dispatch_table(pc_device_table_map, commandBuffer)
3962 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003963 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003964}
3965
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003966VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3967 const VkRect2D *pScissors) {
3968 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003970 assert(my_data != NULL);
3971
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003972 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003973
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003974 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003975 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3976 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003977}
3978
Chia-I Wu01ca2372016-05-13 14:37:49 +08003979VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003980 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003981}
3982
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003983VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
3984 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003985 get_dispatch_table(pc_device_table_map, commandBuffer)
3986 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003987}
3988
Chia-I Wu01ca2372016-05-13 14:37:49 +08003989VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003990 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003991 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003992 assert(my_data != NULL);
3993
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003994 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003996 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003997 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3998 }
Cody Northrop12365112015-08-17 11:10:49 -06003999}
4000
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004001VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004002 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004003}
4004
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004005VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4006 uint32_t compareMask) {
4007 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004008 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4009 assert(my_data != NULL);
4010
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004011 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004012
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004013 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004014 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4015 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004016}
4017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004018VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4019 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004020 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4021 assert(my_data != NULL);
4022
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004023 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004025 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004026 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4027 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004028}
4029
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004030VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4031 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004032 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4033 assert(my_data != NULL);
4034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004035 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004036
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004037 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004038 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4039 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004040}
4041
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004042VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4043 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4044 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4045 const uint32_t *pDynamicOffsets) {
4046 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004047 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004048 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004049
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004050 skip_call |=
4051 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4052 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004053
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004054 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004055 get_dispatch_table(pc_device_table_map, commandBuffer)
4056 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4057 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004058 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004059}
4060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004061VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4062 VkIndexType indexType) {
4063 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004064 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4065 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004066
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004067 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004068
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004069 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004070 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4071 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004072}
4073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004074VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4075 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4076 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004077 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004078 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004080 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004082 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004083 get_dispatch_table(pc_device_table_map, commandBuffer)
4084 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004085 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004086}
4087
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004088bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4089 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004090 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004091 // 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 -07004092 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004093 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 -06004094 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004095 return false;
4096 }
4097
4098 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004099 // 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 -07004100 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004101 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 -06004102 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004103 return false;
4104 }
4105
4106 return true;
4107}
4108
Chia-I Wu01ca2372016-05-13 14:37:49 +08004109VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4110 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004111 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004113 get_dispatch_table(pc_device_table_map, commandBuffer)
4114 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004115}
4116
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004117VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4118 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004119 get_dispatch_table(pc_device_table_map, commandBuffer)
4120 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004121}
4122
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004123VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4124 uint32_t stride) {
4125 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004126 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4127 assert(my_data != NULL);
4128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004129 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004130
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004131 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004132 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4133 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004134}
4135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004136VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4137 uint32_t count, uint32_t stride) {
4138 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004139 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4140 assert(my_data != NULL);
4141
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004142 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004143
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004144 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004145 get_dispatch_table(pc_device_table_map, commandBuffer)
4146 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4147 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004148}
4149
Chia-I Wu01ca2372016-05-13 14:37:49 +08004150VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004151 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004152}
4153
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004154VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4155 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004156 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4157 assert(my_data != NULL);
4158
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004159 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004160
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004161 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004162 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4163 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004164}
4165
Chia-I Wu01ca2372016-05-13 14:37:49 +08004166VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4167 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004168 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004169 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004170 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004171
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004172 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004173
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004174 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004175 get_dispatch_table(pc_device_table_map, commandBuffer)
4176 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004177 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004178}
4179
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004180bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4181 if (pRegions != nullptr) {
4182 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4183 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004184 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 -06004185 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004186 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4187 return false;
4188 }
4189 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4190 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004191 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 -06004192 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004193 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4194 return false;
4195 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004196 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004197
4198 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004199}
4200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004201VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4202 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4203 const VkImageCopy *pRegions) {
4204 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004205 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004206 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004207
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004208 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4209 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004210
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004211 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004212 PreCmdCopyImage(commandBuffer, pRegions);
4213
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004214 get_dispatch_table(pc_device_table_map, commandBuffer)
4215 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004216 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004217}
4218
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004219bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4220 if (pRegions != nullptr) {
4221 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4222 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004223 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 -06004224 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004225 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4226 return false;
4227 }
4228 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4229 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004230 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 -06004231 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004232 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4233 return false;
4234 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004235 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004236
4237 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004238}
4239
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004240VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4241 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4242 const VkImageBlit *pRegions, VkFilter filter) {
4243 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004245 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004246
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004247 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4248 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004249
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004250 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004251 PreCmdBlitImage(commandBuffer, pRegions);
4252
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004253 get_dispatch_table(pc_device_table_map, commandBuffer)
4254 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004255 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004256}
4257
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004258bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4259 if (pRegions != nullptr) {
4260 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4261 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004262 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 -06004263 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004264 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4265 "enumerator");
4266 return false;
4267 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004268 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004269
4270 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004271}
4272
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004273VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4274 VkImageLayout dstImageLayout, uint32_t regionCount,
4275 const VkBufferImageCopy *pRegions) {
4276 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004277 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004278 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004279
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004280 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4281 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004283 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004284 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4285
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004286 get_dispatch_table(pc_device_table_map, commandBuffer)
4287 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004288 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004289}
4290
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004291bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4292 if (pRegions != nullptr) {
4293 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4294 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004295 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 -06004296 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004297 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4298 "enumerator");
4299 return false;
4300 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004301 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004302
4303 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004304}
4305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004306VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4307 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4308 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004309 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004310 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004311
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004312 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4313 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004314
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004315 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004316 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4317
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004318 get_dispatch_table(pc_device_table_map, commandBuffer)
4319 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004320 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004321}
4322
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004323VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4324 VkDeviceSize dataSize, const uint32_t *pData) {
4325 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004326 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004327 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004328
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004329 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004330
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004331 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004332 skip_call |= log_msg(
4333 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4334 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004335 }
4336
4337 if ((dataSize <= 0) || (dataSize > 65536)) {
4338 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 -06004339 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4340 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004341 dataSize);
4342 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004343 skip_call |= log_msg(
4344 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4345 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004346 }
4347
4348 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004349 get_dispatch_table(pc_device_table_map, commandBuffer)
4350 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004351 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004352}
4353
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004354VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4355 VkDeviceSize size, uint32_t data) {
4356 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004357 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4358 assert(my_data != NULL);
4359
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004360 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004361
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004362 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004363 skip_call |= log_msg(
4364 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4365 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004366 }
4367
4368 if (size != VK_WHOLE_SIZE) {
4369 if (size <= 0) {
4370 skip_call |= log_msg(
4371 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004372 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004373 } else if (size & 3) {
4374 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 -06004375 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004376 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4377 }
4378 }
4379
4380 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004381 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4382 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004383}
4384
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004385VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4386 const VkClearColorValue *pColor, uint32_t rangeCount,
4387 const VkImageSubresourceRange *pRanges) {
4388 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004389 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004390 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004391
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004392 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004393
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004394 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004395 get_dispatch_table(pc_device_table_map, commandBuffer)
4396 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004397 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004398}
4399
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004400VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4401 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4402 const VkImageSubresourceRange *pRanges) {
4403 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004404 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004405 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004407 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4408 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004409
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004410 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004411 get_dispatch_table(pc_device_table_map, commandBuffer)
4412 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004414}
4415
Chia-I Wu01ca2372016-05-13 14:37:49 +08004416VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4417 const VkClearAttachment *pAttachments, uint32_t rectCount,
4418 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004419 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004421 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004423 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004425 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004426 get_dispatch_table(pc_device_table_map, commandBuffer)
4427 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004428 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004429}
4430
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004431bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4432 if (pRegions != nullptr) {
4433 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4434 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4435 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004436 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004437 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004438 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4439 return false;
4440 }
4441 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4442 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4443 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004444 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004445 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004446 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4447 return false;
4448 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004449 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004450
4451 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004452}
4453
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004454VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4455 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4456 const VkImageResolve *pRegions) {
4457 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004458 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004459 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004460
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004461 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4462 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004464 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004465 PreCmdResolveImage(commandBuffer, pRegions);
4466
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004467 get_dispatch_table(pc_device_table_map, commandBuffer)
4468 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004469 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004470}
4471
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004472VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4473 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004474 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4475 assert(my_data != NULL);
4476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004477 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004478
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004479 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004480 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4481 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004482}
4483
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004484VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4485 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4487 assert(my_data != NULL);
4488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004489 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004491 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004492 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4493 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004494}
4495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004496VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4497 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4498 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4499 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4500 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4501 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004502 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004503 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004504
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004505 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4506 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4507 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004509 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004510 get_dispatch_table(pc_device_table_map, commandBuffer)
4511 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4512 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004513 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004514}
4515
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004516VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4517 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4518 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4519 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4520 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4521 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004522 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004523 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004524
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004525 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4526 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4527 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004529 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004530 get_dispatch_table(pc_device_table_map, commandBuffer)
4531 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4532 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004533 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004534}
4535
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004536VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4537 VkQueryControlFlags flags) {
4538 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004539 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4540 assert(my_data != NULL);
4541
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004542 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004543
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004544 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004545 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4546 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004547}
4548
Chia-I Wu01ca2372016-05-13 14:37:49 +08004549VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004550 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004551 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4552 assert(my_data != NULL);
4553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004554 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004555
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004556 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004557 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4558 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004559}
4560
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004561VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4562 uint32_t queryCount) {
4563 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004564 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4565 assert(my_data != NULL);
4566
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004567 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004568
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004569 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004570 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4571 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004572}
4573
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004574bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4575 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004576
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004577 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004578
4579 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004580}
4581
Chia-I Wu01ca2372016-05-13 14:37:49 +08004582VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4583 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004584 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004585 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4586 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004587
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004588 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004590 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004591 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4592
4593 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4594 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004595}
4596
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004597VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4598 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4599 VkDeviceSize stride, VkQueryResultFlags flags) {
4600 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004601 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4602 assert(my_data != NULL);
4603
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004604 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4605 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004606
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004607 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004608 get_dispatch_table(pc_device_table_map, commandBuffer)
4609 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4610 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004611}
4612
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004613VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4614 uint32_t offset, uint32_t size, const void *pValues) {
4615 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004616 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004617 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004618
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004619 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004620
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004621 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004622 get_dispatch_table(pc_device_table_map, commandBuffer)
4623 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004624 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004625}
4626
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004627VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4628 VkSubpassContents contents) {
4629 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004630 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004631 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004632
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004633 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004634
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004635 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004636 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004637 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004638}
4639
Chia-I Wu01ca2372016-05-13 14:37:49 +08004640VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004641 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004642 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4643 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004644
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004645 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004646
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004647 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004648 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4649 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004650}
4651
Chia-I Wu01ca2372016-05-13 14:37:49 +08004652VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004653 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004654}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004655
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004656VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4657 const VkCommandBuffer *pCommandBuffers) {
4658 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004659 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004660 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004661
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004662 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004663
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004664 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004665 get_dispatch_table(pc_device_table_map, commandBuffer)
4666 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004667 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004668}
4669
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004670VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004671 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4672}
4673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004674VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4675 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004676 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4677}
4678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004679VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4680 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004681 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4682 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4683
4684 return VK_ERROR_LAYER_NOT_PRESENT;
4685}
4686
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004687VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4688 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004689 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004690 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004691 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004692
4693 assert(physicalDevice);
4694
4695 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4696 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004697}
4698
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004699// WSI Extension Functions
4700
4701VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004702 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004703 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004704 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004705 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4706 assert(my_data != NULL);
4707
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004708 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004710 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004711 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4712
4713 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4714 }
4715
4716 return result;
4717}
4718
4719VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004720 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004721 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004722 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4724 assert(my_data != NULL);
4725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004726 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004727 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004729 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004730 result = get_dispatch_table(pc_device_table_map, device)
4731 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4732
4733 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4734 }
4735
4736 return result;
4737}
4738
4739VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004740 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004741 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004742 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4744 assert(my_data != NULL);
4745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004746 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004747 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004749 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004750 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004751 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004752
4753 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4754 }
4755
4756 return result;
4757}
4758
4759VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4760 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004761 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4763 assert(my_data != NULL);
4764
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004765 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004767 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004768 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4769
4770 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4771 }
4772
4773 return result;
4774}
4775
4776VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4777 VkSurfaceKHR surface, VkBool32 *pSupported) {
4778 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004779 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4781 assert(my_data != NULL);
4782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004783 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004784 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004786 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004787 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4788 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4789
4790 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4791 }
4792
4793 return result;
4794}
4795
4796VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4797 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4798 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004799 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004800 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4801 assert(my_data != NULL);
4802
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004803 skip_call |=
4804 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004805
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004806 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004807 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4808 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4809
4810 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4811 }
4812
4813 return result;
4814}
4815
4816VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4817 uint32_t *pSurfaceFormatCount,
4818 VkSurfaceFormatKHR *pSurfaceFormats) {
4819 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004820 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004821 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4822 assert(my_data != NULL);
4823
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004824 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4825 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004826
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004827 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004828 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4829 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4830
4831 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4832 }
4833
4834 return result;
4835}
4836
4837VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4838 uint32_t *pPresentModeCount,
4839 VkPresentModeKHR *pPresentModes) {
4840 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004841 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004842 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4843 assert(my_data != NULL);
4844
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004845 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4846 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004847
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004848 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004849 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4850 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4851
4852 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4853 }
4854
4855 return result;
4856}
4857
4858#ifdef VK_USE_PLATFORM_WIN32_KHR
4859VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4860 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4861 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4862
4863 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4864 assert(my_data != NULL);
4865
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004866 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004867
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004868 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004869 result =
4870 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4871 }
4872
4873 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4874
4875 return result;
4876}
4877#endif // VK_USE_PLATFORM_WIN32_KHR
4878
4879#ifdef VK_USE_PLATFORM_XCB_KHR
4880VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4881 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4882 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4883
4884 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4885 assert(my_data != NULL);
4886
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004887 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004888
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004889 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004890 result =
4891 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4892 }
4893
4894 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4895
4896 return result;
4897}
4898
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004899VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4900 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4901 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004902 VkBool32 result = false;
4903
4904 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4905 assert(my_data != NULL);
4906
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004907 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4908 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004909
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004910 if (!skip_call) {
4911 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4912 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004913 }
4914
4915 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004916}
4917#endif // VK_USE_PLATFORM_XCB_KHR
4918
4919#ifdef VK_USE_PLATFORM_XLIB_KHR
4920VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004921 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004922 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4923
4924 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4925 assert(my_data != NULL);
4926
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004927 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004928
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004929 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004930 result =
4931 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4932 }
4933
4934 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4935
4936 return result;
4937}
4938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004939VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4940 uint32_t queueFamilyIndex, Display *dpy,
4941 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 VkBool32 result = false;
4943
4944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4945 assert(my_data != NULL);
4946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004947 bool skip_call =
4948 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004950 if (!skip_call) {
4951 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4952 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004954}
4955#endif // VK_USE_PLATFORM_XLIB_KHR
4956
4957#ifdef VK_USE_PLATFORM_MIR_KHR
4958VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004959 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004960 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4961
4962 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4963 assert(my_data != NULL);
4964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004965 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004967 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004968 result =
4969 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4970 }
4971
4972 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4973
4974 return result;
4975}
4976
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004977VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4978 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004979 VkBool32 result = false;
4980
4981 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4982 assert(my_data != NULL);
4983
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004984 bool skip_call =
4985 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004986
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004987 if (!skip_call) {
4988 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4989 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004990 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004991}
4992#endif // VK_USE_PLATFORM_MIR_KHR
4993
4994#ifdef VK_USE_PLATFORM_WAYLAND_KHR
4995VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004996 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004997 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4998
4999 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5000 assert(my_data != NULL);
5001
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005002 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005003
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005004 if (!skip_call) {
5005 result = get_dispatch_table(pc_instance_table_map, instance)
5006 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005007 }
5008
5009 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5010
5011 return result;
5012}
5013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005014VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5015 uint32_t queueFamilyIndex,
5016 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005017 VkBool32 result = false;
5018
5019 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5020 assert(my_data != NULL);
5021
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005022 bool skip_call =
5023 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005025 if (!skip_call) {
5026 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5027 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005028 }
5029}
5030#endif // VK_USE_PLATFORM_WAYLAND_KHR
5031
5032#ifdef VK_USE_PLATFORM_ANDROID_KHR
5033VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005034 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005035 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5036
5037 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5038 assert(my_data != NULL);
5039
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005040 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005041
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005042 if (!skip_call) {
5043 result = get_dispatch_table(pc_instance_table_map, instance)
5044 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005045 }
5046
5047 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5048
5049 return result;
5050}
5051#endif // VK_USE_PLATFORM_ANDROID_KHR
5052
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005053static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005055static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005056
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005057static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005059static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005060
Chia-I Wu01ca2372016-05-13 14:37:49 +08005061VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005062 assert(device);
5063
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005064 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5065
Dustin Graves080069b2016-04-05 13:48:15 -06005066 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005067 return NULL;
5068 }
5069
Chia-I Wuf9b01382016-05-16 07:37:41 +08005070 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5071 if (proc)
5072 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005073
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005074 proc = InterceptWsiEnabledCommand(funcName, device);
5075 if (proc)
5076 return proc;
5077
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005078 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005079 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005080 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005081}
5082
Chia-I Wu01ca2372016-05-13 14:37:49 +08005083VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005084 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005085 if (!proc)
5086 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005087
5088 if (!proc)
5089 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005090
Chia-I Wu617f2a42016-05-16 07:41:17 +08005091 if (proc)
5092 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005093
Chia-I Wu617f2a42016-05-16 07:41:17 +08005094 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005095
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005096 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005097
Chia-I Wu617f2a42016-05-16 07:41:17 +08005098 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005099 if (!proc)
5100 proc = InterceptWsiEnabledCommand(funcName, instance);
5101
Chia-I Wu617f2a42016-05-16 07:41:17 +08005102 if (proc)
5103 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005104
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005105 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005106 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005107 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005108}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005109
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005110static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005111 static const struct {
5112 const char *name;
5113 PFN_vkVoidFunction proc;
5114 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005115 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5116 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5117 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5118 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5119 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5120 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5121 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5122 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5123 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5124 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5125 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5126 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5127 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5128 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5129 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5130 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5131 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Chia-I Wu617f2a42016-05-16 07:41:17 +08005132 };
5133
5134 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5135 if (!strcmp(core_instance_commands[i].name, name))
5136 return core_instance_commands[i].proc;
5137 }
5138
5139 return nullptr;
5140}
5141
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005142static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005143 static const struct {
5144 const char *name;
5145 PFN_vkVoidFunction proc;
5146 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005147 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5148 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5149 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5150 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5151 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5152 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5153 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5154 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5155 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5156 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5157 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5158 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5159 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5160 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5161 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5162 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5163 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5164 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5165 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5166 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5167 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5168 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5169 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5170 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5171 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5172 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5173 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5174 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5175 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5176 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5177 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5178 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5179 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5180 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5181 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5182 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5183 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5184 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5185 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5186 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5187 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5188 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5189 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5190 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5191 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5192 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5193 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5194 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5195 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5196 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5197 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5198 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5199 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5200 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5201 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5202 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5203 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5204 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5205 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5206 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5207 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5208 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5209 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5210 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5211 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5212 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5213 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5214 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5215 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5216 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5217 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5218 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5219 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5220 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5221 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5222 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5223 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5224 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5225 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5226 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5227 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5228 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5229 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5230 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5231 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5232 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5233 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5234 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5235 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5236 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5237 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5238 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5239 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5240 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5241 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5242 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5243 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5244 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5245 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5246 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5247 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5248 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5249 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5250 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5251 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5252 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5253 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5254 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5255 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5256 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5257 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5258 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5259 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5260 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5261 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5262 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5263 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Chia-I Wuf9b01382016-05-16 07:37:41 +08005264 };
5265
5266 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5267 if (!strcmp(core_device_commands[i].name, name))
5268 return core_device_commands[i].proc;
5269 }
5270
5271 return nullptr;
5272}
5273
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005274static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005275 static const struct {
5276 const char *name;
5277 PFN_vkVoidFunction proc;
5278 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005279 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5280 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5281 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5282 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005283 };
5284
5285 if (device) {
5286 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5287 if (!device_data->wsi_enabled)
5288 return nullptr;
5289 }
5290
5291 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5292 if (!strcmp(wsi_device_commands[i].name, name))
5293 return wsi_device_commands[i].proc;
5294 }
5295
5296 return nullptr;
5297}
5298
5299static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5300 static const struct {
5301 const char *name;
5302 PFN_vkVoidFunction proc;
5303 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005304 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5305 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5306 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5307 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5308 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5309 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005310 };
5311
5312 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005313 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005314 return nullptr;
5315
5316 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5317 if (!strcmp(wsi_instance_commands[i].name, name))
5318 return wsi_instance_commands[i].proc;
5319 }
5320
5321#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005322 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005323 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5324#endif // VK_USE_PLATFORM_WIN32_KHR
5325#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005326 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005327 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005328 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005329 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5330#endif // VK_USE_PLATFORM_XCB_KHR
5331#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005332 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005333 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005334 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005335 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5336#endif // VK_USE_PLATFORM_XLIB_KHR
5337#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005338 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005339 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005340 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005341 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5342#endif // VK_USE_PLATFORM_MIR_KHR
5343#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005344 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005345 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005346 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5347 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005348 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5349#endif // VK_USE_PLATFORM_WAYLAND_KHR
5350#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005351 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005352 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5353#endif // VK_USE_PLATFORM_ANDROID_KHR
5354
5355 return nullptr;
5356}
5357
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005358} // namespace parameter_validation
5359
5360// vk_layer_logging.h expects these to be defined
5361
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005362VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5363 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5364 const VkAllocationCallbacks *pAllocator,
5365 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005366 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005367}
5368
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005369VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5370 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005371 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005372}
5373
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005374VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5375 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5376 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005377 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005378}
5379
5380// loader-layer interface v0
5381
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005382VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5383 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005384 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005385}
5386
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005387VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5388 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005389 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005390}
5391
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005392VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5393 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005394 // the layer command handles VK_NULL_HANDLE just fine internally
5395 assert(physicalDevice == VK_NULL_HANDLE);
5396 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005397}
5398
5399VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5400 const char *pLayerName, uint32_t *pCount,
5401 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005402 // the layer command handles VK_NULL_HANDLE just fine internally
5403 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005404 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005405}
5406
5407VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005408 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005409}
5410
5411VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005412 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005413}