blob: 9434ab0a6e283d13bcbd7a59e1686ecf452f5c2f [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
Mike Weiblena4742dc2016-10-31 11:05:56 -060026#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060027#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060028#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32#include <iostream>
33#include <string>
34#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050035#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060036#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060037#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060038
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060039#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070040#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060041#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060042#include "vk_enum_validate_helper.h"
43#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060044
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060045#include "vk_layer_table.h"
46#include "vk_layer_data.h"
47#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060048#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070049#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060050
Dustin Graves8ffbbf62016-07-22 13:19:46 -060051#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060052#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070053
Chia-I Wu1a6b1932016-05-13 14:07:36 +080054namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060055
Cody Northrop55443ef2015-09-28 15:09:32 -060056struct layer_data {
Chia-I Wua570b7c2016-05-16 07:48:14 +080057 VkInstance instance;
58
Jeremy Hayes99a96322015-06-26 12:48:09 -060059 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070060 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060061
Ian Elliotted6b5ac2016-04-28 09:08:13 -060062 // The following are for keeping track of the temporary callbacks that can
63 // be used in vkCreateInstance and vkDestroyInstance:
64 uint32_t num_tmp_callbacks;
65 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
66 VkDebugReportCallbackEXT *tmp_callbacks;
67
Jon Ashburn5484e0c2016-03-08 17:48:44 -070068 // TODO: Split instance/device structs
69 // Device Data
70 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060071 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Mark Lobodzinskia4932512016-06-27 15:13:00 -060072 VkPhysicalDeviceLimits device_limits;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060073 VkPhysicalDeviceFeatures physical_device_features;
74 VkPhysicalDevice physical_device;
Michael Lentinebdf744f2016-01-27 15:43:43 -060075
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060076 bool wsi_enabled;
Mark Youngead9b932016-09-08 12:28:38 -060077 bool wsi_display_swapchain_enabled;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060078
Mark Lobodzinskia4932512016-06-27 15:13:00 -060079 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060080 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
Mark Youngead9b932016-09-08 12:28:38 -060081 physical_device_features{}, physical_device{}, wsi_enabled(false), wsi_display_swapchain_enabled(false) {};
Cody Northrop55443ef2015-09-28 15:09:32 -060082};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060084static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070085static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060086static device_table_map pc_device_table_map;
87static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060088
Mark Lobodzinski739391a2016-03-17 15:08:18 -060089static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060090
Mark Lobodzinski739391a2016-03-17 15:08:18 -060091 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060092}
93
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060094VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
95 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
96 const VkAllocationCallbacks *pAllocator,
97 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070098 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -070099 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600100
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700101 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700102 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600103 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600104 }
105
106 return result;
107}
108
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600109VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800110 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700111 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700112 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600113
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700114 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700115 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600116}
117
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600118VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
119 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
120 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700121 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
122 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700123}
124
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700125static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600126
Chia-I Wu3384db82016-05-16 07:30:58 +0800127static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600128 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800129};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700130
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700131static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600132 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700133 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
134 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
135 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
136 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
137 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 -0700138 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700139 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600140 return false;
141 }
142
143 return true;
144}
145
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700146static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
147 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600148 return "unrecognized enumerator";
149 }
150
151 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600153 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600156 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700158 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600159 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
160 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
163 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600165 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
166 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
169 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700170 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600171 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600180 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800183 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800186 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600187 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700189 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
190 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191
192 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 enumeratorString += string;
195
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600197 enumeratorString += '|';
198 }
199 }
200
201 return enumeratorString;
202}
203
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700204static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
205 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
206 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
207 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
208 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
209 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600210 return false;
211 }
212
213 return true;
214}
215
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
217 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600218 return "unrecognized enumerator";
219 }
220
221 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700222 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600223 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
224 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700225 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600226 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600227 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700228 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600229 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
230 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700231 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
233 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700234 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600235 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
236 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800238 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600239 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
242 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800244 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600245 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246
247 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 enumeratorString += string;
250
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 enumeratorString += '|';
253 }
254 }
255
256 return enumeratorString;
257}
258
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700259static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
260 VkQueueFlagBits allFlags =
261 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
262 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600263 return false;
264 }
265
266 return true;
267}
268
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700269static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
270 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600271 return "unrecognized enumerator";
272 }
273
274 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700275 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800276 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600277 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700278 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600279 strings.push_back("VK_QUEUE_COMPUTE_BIT");
280 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800282 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600283 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700284 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600285 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
286 }
287
288 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600290 enumeratorString += string;
291
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600293 enumeratorString += '|';
294 }
295 }
296
297 return enumeratorString;
298}
299
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700300static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
301 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
302 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
303 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
304 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 return false;
306 }
307
308 return true;
309}
310
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700311static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
312 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600313 return "unrecognized enumerator";
314 }
315
316 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700317 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600318 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
319 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800321 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600322 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
325 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800327 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600328 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700329 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800330 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600331 }
332
333 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600335 enumeratorString += string;
336
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600338 enumeratorString += '|';
339 }
340 }
341
342 return enumeratorString;
343}
344
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700345static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700346 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600348 return false;
349 }
350
351 return true;
352}
353
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700354static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
355 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600356 return "unrecognized enumerator";
357 }
358
359 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700360 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800361 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600362 }
363
364 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600366 enumeratorString += string;
367
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600369 enumeratorString += '|';
370 }
371 }
372
373 return enumeratorString;
374}
375
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700376static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
377 VkSparseImageFormatFlagBits allFlags =
378 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
379 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
380 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600381 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600382 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600383
384 return true;
385}
386
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700387static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
388 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600389 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600390 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600391
392 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700393 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800394 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600395 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800397 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600398 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700399 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800400 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600401 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402
403 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405 enumeratorString += string;
406
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600408 enumeratorString += '|';
409 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600410 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411
412 return enumeratorString;
413}
414
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700415static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700416 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600418 return false;
419 }
420
421 return true;
422}
423
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700424static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
425 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600426 return "unrecognized enumerator";
427 }
428
429 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700430 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600431 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
432 }
433
434 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600436 enumeratorString += string;
437
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600439 enumeratorString += '|';
440 }
441 }
442
443 return enumeratorString;
444}
445
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700446static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
447 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
448 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
449 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
450 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
451 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600452 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
453 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
454 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700455 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600456 return false;
457 }
458
459 return true;
460}
461
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700462static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
463 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600464 return "unrecognized enumerator";
465 }
466
467 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700468 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700469 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600470 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700471 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700472 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700475 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700478 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600479 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700481 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600482 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700484 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700486 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700487 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600488 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700499 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 }
501
502 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600504 enumeratorString += string;
505
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600507 enumeratorString += '|';
508 }
509 }
510
511 return enumeratorString;
512}
513
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700514static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
515 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
516 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
517 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 return false;
519 }
520
521 return true;
522}
523
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700524static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
525 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600526 return "unrecognized enumerator";
527 }
528
529 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700530 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600531 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
532 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700533 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600534 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
535 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600537 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
538 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700539 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 strings.push_back("VK_QUERY_RESULT_64_BIT");
541 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600542
543 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600545 enumeratorString += string;
546
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700547 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600548 enumeratorString += '|';
549 }
550 }
551
552 return enumeratorString;
553}
554
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700555static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
556 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
557 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
558 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
559 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
560 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600561 return false;
562 }
563
564 return true;
565}
566
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700567static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
568 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600569 return "unrecognized enumerator";
570 }
571
572 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700573 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600574 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
575 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700576 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600577 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
578 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700579 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600580 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
581 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700582 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
584 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700585 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600586 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
587 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800589 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600590 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700591 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600592 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
593 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800595 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600596 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700597 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
599 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600
601 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 enumeratorString += string;
604
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 enumeratorString += '|';
607 }
608 }
609
610 return enumeratorString;
611}
612
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700613static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
614 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
615 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
616 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617 return false;
618 }
619
620 return true;
621}
622
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700623static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
624 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600625 return "unrecognized enumerator";
626 }
627
628 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700629 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600630 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
631 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700632 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600633 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
634 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700635 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600636 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 }
638
639 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700640 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600641 enumeratorString += string;
642
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600644 enumeratorString += '|';
645 }
646 }
647
648 return enumeratorString;
649}
650
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700651static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
652 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
653 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
654 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
655 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600656 return false;
657 }
658
659 return true;
660}
661
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700662static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
663 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600664 return "unrecognized enumerator";
665 }
666
667 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700668 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600669 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
670 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600672 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
673 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600675 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
676 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
679 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700680 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600681 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600682 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600683
684 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686 enumeratorString += string;
687
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600689 enumeratorString += '|';
690 }
691 }
692
693 return enumeratorString;
694}
695
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700696static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
697 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
698 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
699 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 return false;
701 }
702
703 return true;
704}
705
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700706static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
707 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600708 return "unrecognized enumerator";
709 }
710
711 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700712 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800713 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600714 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700715 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800716 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800719 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700721 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800722 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600723 }
724
725 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600727 enumeratorString += string;
728
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700729 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600730 enumeratorString += '|';
731 }
732 }
733
734 return enumeratorString;
735}
736
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700737static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
738 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
739 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
740 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600741 return false;
742 }
743
744 return true;
745}
746
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700747static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
748 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600749 return "unrecognized enumerator";
750 }
751
752 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700753 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600754 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
755 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700756 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600757 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
758 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700759 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600760 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600761 }
762
763 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700764 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600765 enumeratorString += string;
766
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700767 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600768 enumeratorString += '|';
769 }
770 }
771
772 return enumeratorString;
773}
774
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700775static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
776 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
777 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
778 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
779 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600780 return false;
781 }
782
783 return true;
784}
785
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700786static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
787 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600788 return "unrecognized enumerator";
789 }
790
791 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600793 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600794 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600796 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600797 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600799 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
800 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700801 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600802 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
803 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700804 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600805 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600808 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600809 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700810 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600811 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600812 }
813
814 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600816 enumeratorString += string;
817
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600819 enumeratorString += '|';
820 }
821 }
822
823 return enumeratorString;
824}
825
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700826static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800827 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
829 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
830 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
831 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
832 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
833 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 -0700834 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700835 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600836 return false;
837 }
838
839 return true;
840}
841
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700842static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
843 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600844 return "unrecognized enumerator";
845 }
846
847 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800849 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
850 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800852 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600855 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600858 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600859 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600861 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600862 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700864 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700866 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600867 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600868 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600870 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600873 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600882 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700885 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 }
899
900 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600902 enumeratorString += string;
903
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600905 enumeratorString += '|';
906 }
907 }
908
909 return enumeratorString;
910}
911
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700912static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800913 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
915 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
916 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
917 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
918 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 +0800919
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700920 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600921 return false;
922 }
923
924 return true;
925}
926
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700927static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
928 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600929 return "unrecognized enumerator";
930 }
931
932 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700933 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800934 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600935 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700936 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800937 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600938 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700939 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800940 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600941 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700942 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800943 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600944 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700945 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800946 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600947 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800949 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600950 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800952 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600953 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600983 }
984
985 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600987 enumeratorString += string;
988
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600990 enumeratorString += '|';
991 }
992 }
993
994 return enumeratorString;
995}
996
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700997static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
998 VkCommandPoolCreateFlagBits allFlags =
999 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1000 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001001 return false;
1002 }
1003
1004 return true;
1005}
1006
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001007static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1008 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001009 return "unrecognized enumerator";
1010 }
1011
1012 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001013 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001014 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001015 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001016 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001017 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001018 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001019
1020 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001021 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001022 enumeratorString += string;
1023
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001024 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001025 enumeratorString += '|';
1026 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001027 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001028
1029 return enumeratorString;
1030}
1031
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001032static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001033 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001035 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001036 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001037
1038 return true;
1039}
1040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001041static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1042 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001043 return "unrecognized enumerator";
1044 }
1045
1046 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001047 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001048 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001049 }
1050
1051 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001053 enumeratorString += string;
1054
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001056 enumeratorString += '|';
1057 }
1058 }
1059
1060 return enumeratorString;
1061}
1062
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001063static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1064 VkCommandBufferUsageFlags allFlags =
1065 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1066 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1067 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001068 return false;
1069 }
1070
1071 return true;
1072}
1073
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001074static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1075 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001076 return "unrecognized enumerator";
1077 }
1078
1079 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001080 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001081 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001082 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001085 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001086 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001087 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 }
1089
1090 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 enumeratorString += string;
1093
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001095 enumeratorString += '|';
1096 }
1097 }
1098
1099 return enumeratorString;
1100}
1101
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001102static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001103 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001104 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001105 return false;
1106 }
1107
1108 return true;
1109}
1110
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001111static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1112 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001113 return "unrecognized enumerator";
1114 }
1115
1116 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001117 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001118 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001119 }
1120
1121 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001123 enumeratorString += string;
1124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001126 enumeratorString += '|';
1127 }
1128 }
1129
1130 return enumeratorString;
1131}
1132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001133static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1134 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1135 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1136 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001137 return false;
1138 }
1139
1140 return true;
1141}
1142
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001143static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1144 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001145 return "unrecognized enumerator";
1146 }
1147
1148 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001149 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001150 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1151 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001152 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001153 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001156 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001158 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001159 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1160 }
1161
1162 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001164 enumeratorString += string;
1165
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001166 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 enumeratorString += '|';
1168 }
1169 }
1170
1171 return enumeratorString;
1172}
1173
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001174static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001175 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001176 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001177 return false;
1178 }
1179
1180 return true;
1181}
1182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001183static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1184 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001185 return "unrecognized enumerator";
1186 }
1187
1188 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001189 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001190 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001191 }
1192
1193 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001195 enumeratorString += string;
1196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001198 enumeratorString += '|';
1199 }
1200 }
1201
1202 return enumeratorString;
1203}
1204
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001205static const int MaxParamCheckerStringLength = 256;
1206
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001207static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001208 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001209 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001210 assert(validateString != nullptr);
1211
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001212 bool skip_call = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001213
1214 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1215
1216 if (result == VK_STRING_ERROR_NONE) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001217 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001218 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001219
1220 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1221 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1222 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001223 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001224 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1225 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1226 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001227 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001228 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001229}
1230
Dustin Gravesde628532016-04-21 16:30:17 -06001231static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1232 uint32_t index) {
1233 assert(device_data != nullptr);
1234 debug_report_data *report_data = device_data->report_data;
1235 bool skip_call = false;
1236
1237 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001238 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1239 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001240 } else {
1241 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1242 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1243 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001244 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1245 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001246 function_name, parameter_name, index);
1247 return false;
1248 }
1249 }
1250
1251 return skip_call;
1252}
1253
1254static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1255 const uint32_t count, const uint32_t *indices) {
1256 assert(device_data != nullptr);
1257 debug_report_data *report_data = device_data->report_data;
1258 bool skip_call = false;
1259
1260 if (indices != nullptr) {
1261 for (uint32_t i = 0; i < count; i++) {
1262 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001263 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1264 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001265 } else {
1266 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1267 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1268 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001269 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1270 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001271 function_name, parameter_name, i, indices[i]);
1272 return false;
1273 }
1274 }
1275 }
1276 }
1277
1278 return skip_call;
1279}
1280
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001281static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001283VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1284 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001285 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001287 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001288 assert(chain_info != nullptr);
1289 assert(chain_info->u.pLayerInfo != nullptr);
1290
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001291 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1292 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001293 if (fpCreateInstance == NULL) {
1294 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001295 }
1296
Dustin Graves842621d2016-03-03 14:17:08 -07001297 // Advance the link info for the next element on the chain
1298 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1299
1300 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001301
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001302 if (result == VK_SUCCESS) {
1303 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1304 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001305
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001306 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001307
Chia-I Wua570b7c2016-05-16 07:48:14 +08001308 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001309 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1310 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001311
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001312 // Look for one or more debug report create info structures
1313 // and setup a callback(s) for each one found.
1314 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1315 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1316 if (my_instance_data->num_tmp_callbacks > 0) {
1317 // Setup the temporary callback(s) here to catch early issues:
1318 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1319 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1320 // Failure of setting up one or more of the callback.
1321 // Therefore, clean up and don't use those callbacks:
1322 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1323 my_instance_data->num_tmp_callbacks = 0;
1324 }
1325 }
1326 }
1327
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001328 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001329 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001330
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001331 // Ordinarily we'd check these before calling down the chain, but none of the layer
1332 // support is in place until now, if we survive we can report the issue now.
1333 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001334
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001335 if (pCreateInfo->pApplicationInfo) {
1336 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1337 validate_string(my_instance_data->report_data, "vkCreateInstance",
1338 "pCreateInfo->VkApplicationInfo->pApplicationName",
1339 pCreateInfo->pApplicationInfo->pApplicationName);
1340 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001341
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001342 if (pCreateInfo->pApplicationInfo->pEngineName) {
1343 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1344 pCreateInfo->pApplicationInfo->pEngineName);
1345 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001346 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001347
1348 // Disable the tmp callbacks:
1349 if (my_instance_data->num_tmp_callbacks > 0) {
1350 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1351 my_instance_data->tmp_callbacks);
1352 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001353 }
1354
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001355 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001356}
1357
Chia-I Wu01ca2372016-05-13 14:37:49 +08001358VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001359 // Grab the key before the instance is destroyed.
1360 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001361 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001362 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001363 assert(my_data != NULL);
1364
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001365 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1366 bool callback_setup = false;
1367 if (my_data->num_tmp_callbacks > 0) {
1368 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1369 my_data->tmp_callbacks)) {
1370 callback_setup = true;
1371 }
1372 }
1373
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001374 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001375
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001376 // Disable and cleanup the temporary callback(s):
1377 if (callback_setup) {
1378 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1379 }
1380 if (my_data->num_tmp_callbacks > 0) {
1381 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1382 my_data->num_tmp_callbacks = 0;
1383 }
1384
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001385 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001386 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001387 pTable->DestroyInstance(instance, pAllocator);
1388
1389 // Clean up logging callback, if any
1390 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001391 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1392 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001393 my_data->logging_callback.pop_back();
1394 }
1395
Chris Forbes78a56b02016-11-02 16:13:01 +13001396 layer_debug_report_destroy_instance(my_data->report_data);
Dustin Graves27a912a2016-03-07 17:52:14 -07001397 layer_data_map.erase(pTable);
1398
1399 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001400 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001401 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001402}
1403
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001404VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1405 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001406 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001407 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001409 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001410
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001411 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001412
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001413 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001414 result = get_dispatch_table(pc_instance_table_map, instance)
1415 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001416
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001417 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001418 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1419 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1420 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1421 // Save the supported features for each physical device
1422 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1423 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1424 }
1425 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001426 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001427 return result;
1428}
1429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001430VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1431 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001432 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001435 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001437 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001438 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001439 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001440}
1441
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001442VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1443 VkFormatProperties *pFormatProperties) {
1444 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001445 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001446 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001448 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001450 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001451 get_dispatch_table(pc_instance_table_map, physicalDevice)
1452 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001454}
1455
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001456VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1457 VkImageType type, VkImageTiling tiling,
1458 VkImageUsageFlags usage, VkImageCreateFlags flags,
1459 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001460 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001461 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001462 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001463 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001465 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1466 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001467
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001468 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001469 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1470 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1471 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001472
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001473 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001474 }
Chia-I Wu17241042015-10-31 00:31:16 +08001475
1476 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001477}
1478
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001479VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1480 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001481 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001482 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001483
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001484 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001486 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001488 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001489}
1490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001491VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1492 uint32_t *pQueueFamilyPropertyCount,
1493 VkQueueFamilyProperties *pQueueFamilyProperties) {
1494 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001495 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001497
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001498 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1499 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001501 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001502 get_dispatch_table(pc_instance_table_map, physicalDevice)
1503 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001505}
1506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001507VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1508 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1509 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001510 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001511 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001512
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001513 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001514
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001515 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001516 get_dispatch_table(pc_instance_table_map, physicalDevice)
1517 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001518 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001519}
1520
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001521void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1522 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001523 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001524
Chris Forbes0e0161a2016-11-02 16:21:28 +13001525 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1526
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001527 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1528 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1529 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001530 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001531 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001532 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1533 "structure.",
1534 i);
1535 } else {
1536 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001537 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001538
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001539 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1540 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1541 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1542 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001543 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001544 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001545 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1546 "between 0 and 1. Actual value is %f",
1547 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1548 }
1549 }
1550 }
1551
1552 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1553 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001554 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001555 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001556 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1557 "of queue families.",
1558 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001559 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1560 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1561 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001562 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001563 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001564 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1565 "queues for the given family index.",
1566 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001567 }
Michael Lentine774704f2016-01-27 13:36:46 -06001568 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001569 }
1570}
1571
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001572static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001573 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001574
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001575 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001576
1577 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1578 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001579 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001580 }
1581#ifdef VK_USE_PLATFORM_XLIB_KHR
1582 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001583 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001584 }
1585#endif
1586#ifdef VK_USE_PLATFORM_XCB_KHR
1587 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001588 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001589 }
1590#endif
1591#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1592 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001593 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001594 }
1595#endif
1596#ifdef VK_USE_PLATFORM_MIR_KHR
1597 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001598 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001599 }
1600#endif
1601#ifdef VK_USE_PLATFORM_ANDROID_KHR
1602 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001603 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001604 }
1605#endif
1606#ifdef VK_USE_PLATFORM_WIN32_KHR
1607 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001608 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001609 }
1610#endif
1611 }
1612}
1613
1614static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1615 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1616 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06001617 device_data->wsi_display_swapchain_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001618
1619 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1620 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1621 device_data->wsi_enabled = true;
1622 }
Mark Youngead9b932016-09-08 12:28:38 -06001623 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
1624 device_data->wsi_display_swapchain_enabled = true;
1625 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001626 }
1627}
1628
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001629void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001630 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001631
1632 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1633 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1634 my_device_data->queueFamilyIndexMap.insert(
1635 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1636 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001637 }
1638}
1639
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001640VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001641 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001642 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001643 * NOTE: We do not validate physicalDevice or any dispatchable
1644 * object as the first parameter. We couldn't get here if it was wrong!
1645 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001646
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001647 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001648 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001649 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001650 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001651
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001652 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001653
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001654 if (pCreateInfo != NULL) {
1655 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001656 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001657 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1658 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001659 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001660 }
Michael Lentine774704f2016-01-27 13:36:46 -06001661
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001662 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001663 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001664 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1665 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001666 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001667 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001668 }
1669
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001670 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001671 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001672 assert(chain_info != nullptr);
1673 assert(chain_info->u.pLayerInfo != nullptr);
1674
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001675 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1676 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001677 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001678 if (fpCreateDevice == NULL) {
1679 return VK_ERROR_INITIALIZATION_FAILED;
1680 }
1681
1682 // Advance the link info for the next element on the chain
1683 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1684
1685 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001686
1687 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1688
1689 if (result == VK_SUCCESS) {
1690 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1691 assert(my_device_data != nullptr);
1692
1693 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1694 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1695
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001696 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1697
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001698 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001699 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1700 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001701 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001702 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001703
1704 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1705 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001706
1707 // Query and save physical device limits for this device
1708 VkPhysicalDeviceProperties device_properties = {};
1709 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1710 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001711 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001712
1713 // Save app-enabled features in this device's layer_data structure
1714 if (pCreateInfo->pEnabledFeatures) {
1715 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1716 } else {
1717 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1718 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001719 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001720 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001721
Jeremy Hayes99a96322015-06-26 12:48:09 -06001722 return result;
1723}
1724
Chia-I Wu01ca2372016-05-13 14:37:49 +08001725VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001726 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001727 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001728 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1729 assert(my_data != NULL);
1730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001731 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001732
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001733 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001734 layer_debug_report_destroy_device(device);
1735
Jeremy Hayes99a96322015-06-26 12:48:09 -06001736#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001737 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001738#endif
1739
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001740 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001741 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001742 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001743 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001744}
1745
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001746bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001747 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001748 assert(my_device_data != nullptr);
1749
Dustin Gravesde628532016-04-21 16:30:17 -06001750 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001751
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001752 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001753 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001754 log_msg(my_device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001755 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001756 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1757 "was created.",
1758 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001759 return false;
1760 }
1761 return true;
1762}
1763
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001764VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1765 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001766 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001767 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001768
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001769 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001770
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001771 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001772 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1773
1774 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001775 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001776}
1777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001778VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001779 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001780 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001781 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001782 assert(my_data != NULL);
1783
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001784 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001786 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001787 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1788
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001789 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001790 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001791
Jeremy Hayes99a96322015-06-26 12:48:09 -06001792 return result;
1793}
1794
Chia-I Wu01ca2372016-05-13 14:37:49 +08001795VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001796 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1797 assert(my_data != NULL);
1798
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001799 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001800
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001801 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001802
1803 return result;
1804}
1805
Chia-I Wu01ca2372016-05-13 14:37:49 +08001806VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001807 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1808 assert(my_data != NULL);
1809
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001810 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001811
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001812 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001813
1814 return result;
1815}
1816
Chia-I Wu01ca2372016-05-13 14:37:49 +08001817VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001818 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001819 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001820 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001821 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001822 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001823
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001824 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001825
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001826 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001827 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1828
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001829 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001830 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001831
1832 return result;
1833}
1834
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001835VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1836 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001837 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001838 assert(my_data != NULL);
1839
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001840 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001841
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001842 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001843 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001844 }
1845}
1846
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001847VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1848 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001849 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001850 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001851 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001852 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001853
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001854 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001855
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001856 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001857 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1858
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001859 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001860 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001861
1862 return result;
1863}
1864
Chia-I Wu01ca2372016-05-13 14:37:49 +08001865VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001866 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001867 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1868 assert(my_data != NULL);
1869
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001870 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001871
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001872 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001873 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1874 }
1875}
1876
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001877VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1878 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001879 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001880 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001881 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001882 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001883
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001884 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001885
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001886 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001887 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1888
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001889 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001890 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001891
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001892 return result;
1893}
1894
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001895VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1896 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001897 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001898 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001899 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001900 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001901
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001902 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001904 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001905 result =
1906 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001908 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001909 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001910
Tony Barbourb1250542015-04-16 19:23:13 -06001911 return result;
1912}
1913
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001914VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1915 VkDeviceSize *pCommittedMemoryInBytes) {
1916 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001917 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001918 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001919
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001920 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001921
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001922 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001923 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001924 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001925}
1926
Chia-I Wu01ca2372016-05-13 14:37:49 +08001927VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1928 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001929 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001930 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001931 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1932 assert(my_data != NULL);
1933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001934 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001935
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001936 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001937 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1938
1939 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1940 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001941
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001942 return result;
1943}
1944
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001945VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001946 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001947 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001948 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1949 assert(my_data != NULL);
1950
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001951 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001952
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001953 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001954 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1955
1956 validate_result(my_data->report_data, "vkBindImageMemory", result);
1957 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001958
1959 return result;
1960}
1961
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001962VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1963 VkMemoryRequirements *pMemoryRequirements) {
1964 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001965 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001966 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001967
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001968 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001969
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001970 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001971 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001972 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001973}
1974
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001975VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1976 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001978 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001979
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001980 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001981
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001982 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001983 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001984 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001985}
1986
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001987bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1988 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001989 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001990 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001991 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001992 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1993 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001994 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001995 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1997 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001998 return false;
1999 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002000 }
2001
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002002 return true;
2003}
2004
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002005VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2006 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2007 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002008 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002009 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002010
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002011 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2012 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002014 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002015 get_dispatch_table(pc_device_table_map, device)
2016 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002017
2018 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2019 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020}
2021
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002022bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2023 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2024 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002025 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002026 if (pProperties != nullptr) {
2027 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2028 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002029 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002030 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002031 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2032 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002033 return false;
2034 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002035 }
2036
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002037 return true;
2038}
2039
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002040VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2041 VkImageType type, VkSampleCountFlagBits samples,
2042 VkImageUsageFlags usage, VkImageTiling tiling,
2043 uint32_t *pPropertyCount,
2044 VkSparseImageFormatProperties *pProperties) {
2045 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002046 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002047 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002048
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002049 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2050 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002051
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002052 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002053 get_dispatch_table(pc_instance_table_map, physicalDevice)
2054 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2055 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002057 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2058 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002059 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002060}
2061
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002062VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2063 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002064 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002065 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002066 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002067 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002068
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002069 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002070
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002071 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002072 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2073
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002074 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002075 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002076
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002077 return result;
2078}
2079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002080VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2081 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002082 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002083 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002084 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002085 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002087 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002089 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002090 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2091
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002092 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002093 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002094
2095 return result;
2096}
2097
Chia-I Wu01ca2372016-05-13 14:37:49 +08002098VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002099 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002101 assert(my_data != NULL);
2102
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002103 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002105 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002106 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002107 }
2108}
2109
Chia-I Wu01ca2372016-05-13 14:37:49 +08002110VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002111 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
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 Graves1e92cd72016-02-09 14:00:18 -07002114 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002115
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002116 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002117
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002118 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002119 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2120
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002121 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002122 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002123
2124 return result;
2125}
2126
Chia-I Wu01ca2372016-05-13 14:37:49 +08002127VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002128 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002129 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002130 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2131 assert(my_data != NULL);
2132
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002133 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002134
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002135 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002136 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2137
2138 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2139 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002140
2141 return result;
2142}
2143
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002144VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2145 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002146 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002147 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002149 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002150
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002151 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002153 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002154 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2155
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002156 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002157 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002158
2159 return result;
2160}
2161
Chia-I Wu01ca2372016-05-13 14:37:49 +08002162VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002163 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002164 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002165 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002167 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002168
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002169 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002171 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002172 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2173
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002174 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002175 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002176
2177 return result;
2178}
2179
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002180VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2181 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002182 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002183 assert(my_data != NULL);
2184
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002185 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002186
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002187 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002188 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002189 }
2190}
2191
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002192VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2193 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002194 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002195 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002196 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002197 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002199 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002201 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002202 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2203
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002204 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002205 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002206
2207 return result;
2208}
2209
Chia-I Wu01ca2372016-05-13 14:37:49 +08002210VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002211 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002212 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002213 assert(my_data != NULL);
2214
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002215 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002216
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002217 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002218 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002219 }
2220}
2221
Chia-I Wu01ca2372016-05-13 14:37:49 +08002222VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002223 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002224 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002225 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2226 assert(my_data != NULL);
2227
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002228 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002229
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002230 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002231 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2232
2233 validate_result(my_data->report_data, "vkGetEventStatus", result);
2234 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002235
2236 return result;
2237}
2238
Chia-I Wu01ca2372016-05-13 14:37:49 +08002239VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002240 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002241 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002242 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2243 assert(my_data != NULL);
2244
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002245 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002246
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002247 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002248 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2249
2250 validate_result(my_data->report_data, "vkSetEvent", result);
2251 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002252
2253 return result;
2254}
2255
Chia-I Wu01ca2372016-05-13 14:37:49 +08002256VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002257 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002258 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002259 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2260 assert(my_data != NULL);
2261
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002262 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002263
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002264 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002265 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2266
2267 validate_result(my_data->report_data, "vkResetEvent", result);
2268 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002269
2270 return result;
2271}
2272
Chia-I Wu01ca2372016-05-13 14:37:49 +08002273VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002274 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002275 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002276 bool skip_call = false;
2277 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2278 assert(device_data != nullptr);
2279 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002280
Dustin Gravesc900f572016-05-16 11:07:59 -06002281 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002282
Dustin Gravesc900f572016-05-16 11:07:59 -06002283 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2284 if (pCreateInfo != nullptr) {
2285 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2286 // VkQueryPipelineStatisticFlagBits values
2287 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2288 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2289 skip_call |=
2290 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2291 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2292 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2293 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2294 }
2295 }
2296
2297 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002298 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2299
Dustin Gravesc900f572016-05-16 11:07:59 -06002300 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002301 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002302
2303 return result;
2304}
2305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002306VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2307 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002308 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002309 assert(my_data != NULL);
2310
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002311 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002312
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002313 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002314 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002315 }
2316}
2317
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002318VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2319 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002320 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002321 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002322 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002323 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002324
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002325 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2326 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002327
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002328 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002329 result = get_dispatch_table(pc_device_table_map, device)
2330 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002331
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002332 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002333 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002334
2335 return result;
2336}
2337
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002338VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2339 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002341 bool skip_call = false;
2342 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2343 assert(device_data != nullptr);
2344 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002345
Karl Schultza9ef1e52016-10-06 17:53:48 -06002346 // TODO: Add check for VALIDATION_ERROR_00660
2347 // TODO: Add check for VALIDATION_ERROR_00661
2348 // TODO: Add check for VALIDATION_ERROR_00662
2349 // TODO: Add check for VALIDATION_ERROR_00670
2350 // TODO: Add check for VALIDATION_ERROR_00671
2351 // TODO: Add check for VALIDATION_ERROR_00672
2352 // TODO: Add check for VALIDATION_ERROR_00673
2353 // TODO: Add check for VALIDATION_ERROR_00674
2354 // TODO: Add check for VALIDATION_ERROR_00675
2355 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2356 // TODO: Add check for VALIDATION_ERROR_00663
Dustin Gravesc900f572016-05-16 11:07:59 -06002357 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002358
Dustin Gravesc900f572016-05-16 11:07:59 -06002359 if (pCreateInfo != nullptr) {
2360 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2361 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2362 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2363 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Karl Schultza9ef1e52016-10-06 17:53:48 -06002364 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2365 __LINE__, VALIDATION_ERROR_00665, LayerName,
2366 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2367 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2368 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002369 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002370
Dustin Gravesc900f572016-05-16 11:07:59 -06002371 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2372 // queueFamilyIndexCount uint32_t values
2373 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2374 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002375 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002376 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2377 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002378 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2379 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002380 }
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) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002553 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002554 if (pSubresource != nullptr) {
2555 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2556 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002557 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002558 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002559 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2560 return false;
2561 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002562 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002563
2564 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002565}
2566
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002567VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2568 VkSubresourceLayout *pLayout) {
2569 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002570 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002571 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002572
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002573 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002574
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002575 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002576 PreGetImageSubresourceLayout(device, pSubresource);
2577
2578 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002579 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002580}
2581
Chia-I Wu01ca2372016-05-13 14:37:49 +08002582VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2583 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002584 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002585 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002586 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002587 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002588 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002589
Dustin Graves0b70a632016-04-27 17:44:56 -06002590 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002591
Dustin Graves0b70a632016-04-27 17:44:56 -06002592 if (pCreateInfo != nullptr) {
2593 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002594 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2595 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002596 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2597 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2598 "pCreateInfo->subresourceRange.layerCount must be 1",
2599 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2600 }
2601 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002602 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2603 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2604 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002605 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2606 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2607 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2608 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2609 }
2610 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002611 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2612 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002613 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2614 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2615 "pCreateInfo->subresourceRange.layerCount must be 6");
2616 }
2617 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002618 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2619 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002620 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2621 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2622 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2623 }
2624 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2625 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2626 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2627 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2628 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2629 }
2630
Dustin Graves2a80dc62016-07-12 13:57:02 -06002631 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2632 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002633 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2634 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2635 "pCreateInfo->subresourceRange.layerCount must be 1");
2636 }
2637 }
2638 }
2639
2640 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002641 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2642
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002643 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002644 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002645
2646 return result;
2647}
2648
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002649VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2650 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002651 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002652 assert(my_data != NULL);
2653
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002654 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002655
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002656 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002657 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002658 }
2659}
2660
Chia-I Wu01ca2372016-05-13 14:37:49 +08002661VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002662 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002663 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002664 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002665 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002666 assert(my_data != NULL);
2667
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002668 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002669
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002670 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002671 result =
2672 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002673
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002674 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002675 }
2676
Michael Lentine03d8e572015-09-15 14:59:14 -05002677 return result;
2678}
2679
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002680VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2681 const VkAllocationCallbacks *pAllocator) {
2682 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002683 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002684 assert(my_data != NULL);
2685
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002686 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002687
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002688 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002689 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002690 }
2691}
2692
Chia-I Wu01ca2372016-05-13 14:37:49 +08002693VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002694 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002695 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002696 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002697 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002698 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002699
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002700 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002702 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002703 result =
2704 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002705
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002706 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002707 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002708
2709 return result;
2710}
2711
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002712VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2713 const VkAllocationCallbacks *pAllocator) {
2714 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002715 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002716 assert(my_data != NULL);
2717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002718 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002719
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002720 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002721 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002722 }
2723}
2724
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002725VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2726 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002727 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002728 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002729 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002730 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002731
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002732 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002733
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002734 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002735 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2736
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002737 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002738 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002739
2740 return result;
2741}
2742
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002743VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2744 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002745 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002746 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002747 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002748 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002750 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002751
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002752 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002753 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2754
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002755 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002756 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002757
2758 return result;
2759}
2760
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002761bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002762 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2763
2764 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002765 if (pCreateInfos != nullptr) {
2766 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2767 if (pCreateInfos->basePipelineIndex != -1) {
2768 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002769 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002770 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002771 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2772 "pCreateInfos->flags "
2773 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2774 return false;
2775 }
2776 }
2777
2778 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2779 if (pCreateInfos->basePipelineIndex != -1) {
2780 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002781 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002782 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002783 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2784 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2785 "VK_NULL_HANDLE");
2786 return false;
2787 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002788 }
2789 }
2790
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002791 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002792 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002793 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002794 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002795 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2796 "unrecognized enumerator");
2797 return false;
2798 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002799
2800 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2801 (data->physical_device_features.fillModeNonSolid == false)) {
2802 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002803 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002804 DEVICE_FEATURE, LayerName,
2805 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2806 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2807 return false;
2808 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002810
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002811 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002812 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002813 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2814 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002815 pCreateInfos[i].pStages[j].pName);
2816 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002817 }
2818
2819 return true;
2820}
2821
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002822VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2823 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2824 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002825 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002826 bool skip_call = false;
2827 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2828 assert(device_data != nullptr);
2829 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002830
Dustin Gravesc900f572016-05-16 11:07:59 -06002831 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2832 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002833
Dustin Gravesc900f572016-05-16 11:07:59 -06002834 if (pCreateInfos != nullptr) {
2835 for (uint32_t i = 0; i < createInfoCount; ++i) {
2836 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2837 if (pCreateInfos[i].pTessellationState == nullptr) {
2838 if (pCreateInfos[i].pStages != nullptr) {
2839 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2840 // pTessellationState must not be NULL
2841 bool has_control = false;
2842 bool has_eval = false;
2843
2844 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2845 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2846 has_control = true;
2847 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2848 has_eval = true;
2849 }
2850 }
2851
2852 if (has_control && has_eval) {
2853 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2854 __LINE__, REQUIRED_PARAMETER, LayerName,
2855 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2856 "control shader stage and a tessellation evaluation shader stage, "
2857 "pCreateInfos[%d].pTessellationState must not be NULL",
2858 i, i);
2859 }
2860 }
Dustin Graves629259b2016-05-30 16:14:27 -06002861 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002862 skip_call |= validate_struct_pnext(
2863 report_data, "vkCreateGraphicsPipelines",
2864 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2865 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002866
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002867 skip_call |= validate_reserved_flags(
2868 report_data, "vkCreateGraphicsPipelines",
2869 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2870 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002871
2872 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2873 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2874 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2875 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2876 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2877 i);
2878 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002879 }
2880
2881 if (pCreateInfos[i].pViewportState == nullptr) {
2882 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2883 // valid VkPipelineViewportStateCreateInfo structure
2884 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2885 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2886 skip_call |= log_msg(
2887 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2888 REQUIRED_PARAMETER, LayerName,
2889 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2890 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2891 i, i);
2892 }
2893 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002894 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002895 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2896 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2897 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002898
2899 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002900 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2901 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002902 pCreateInfos[i].pViewportState->flags);
2903
Dustin Gravesc900f572016-05-16 11:07:59 -06002904 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2905 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2906 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2907 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2908 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2909 i);
2910 }
2911
2912 if (pCreateInfos[i].pDynamicState != nullptr) {
2913 bool has_dynamic_viewport = false;
2914 bool has_dynamic_scissor = false;
2915
2916 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2917 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2918 has_dynamic_viewport = true;
2919 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2920 has_dynamic_scissor = true;
2921 }
2922 }
2923
2924 // viewportCount must be greater than 0
2925 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2926 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2927 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2928 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002929 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2930 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002931 "must be greater than 0",
2932 i, i);
2933 }
2934
2935 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2936 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2937 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2938 skip_call |=
2939 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2940 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002941 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002942 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2943 i, i);
2944 }
2945
2946 // scissorCount must be greater than 0
2947 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2948 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2949 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2950 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002951 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2952 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002953 "must be greater than 0",
2954 i, i);
2955 }
2956
2957 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2958 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2959 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2960 skip_call |=
2961 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2962 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002963 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002964 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2965 i, i);
2966 }
2967 }
2968 }
2969
2970 if (pCreateInfos[i].pMultisampleState == nullptr) {
2971 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2972 // a valid VkPipelineMultisampleStateCreateInfo structure
2973 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2974 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2975 skip_call |=
2976 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2977 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2978 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2979 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2980 i, i);
2981 }
Dustin Graves629259b2016-05-30 16:14:27 -06002982 } else {
2983 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002984 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2985 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002986 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002987
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002988 skip_call |= validate_reserved_flags(
2989 report_data, "vkCreateGraphicsPipelines",
2990 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2991 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002992
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002993 skip_call |= validate_bool32(
2994 report_data, "vkCreateGraphicsPipelines",
2995 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
2996 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002997
2998 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002999 report_data, "vkCreateGraphicsPipelines",
3000 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3001 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3002 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3003 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003004
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003005 skip_call |= validate_bool32(
3006 report_data, "vkCreateGraphicsPipelines",
3007 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3008 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003009
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003010 skip_call |= validate_bool32(
3011 report_data, "vkCreateGraphicsPipelines",
3012 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3013 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003014
3015 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3016 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3017 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3018 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3019 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3020 i);
3021 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003022 }
3023
3024 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003025 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003026 skip_call |= validate_struct_pnext(
3027 report_data, "vkCreateGraphicsPipelines",
3028 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3029 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003030
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003031 skip_call |= validate_reserved_flags(
3032 report_data, "vkCreateGraphicsPipelines",
3033 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3034 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003035
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003036 skip_call |= validate_bool32(
3037 report_data, "vkCreateGraphicsPipelines",
3038 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3039 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003040
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003041 skip_call |= validate_bool32(
3042 report_data, "vkCreateGraphicsPipelines",
3043 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3044 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003045
3046 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003047 report_data, "vkCreateGraphicsPipelines",
3048 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3049 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3050 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003051
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003052 skip_call |= validate_bool32(
3053 report_data, "vkCreateGraphicsPipelines",
3054 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3055 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003056
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003057 skip_call |= validate_bool32(
3058 report_data, "vkCreateGraphicsPipelines",
3059 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3060 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003061
3062 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003063 report_data, "vkCreateGraphicsPipelines",
3064 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3065 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3066 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003067
3068 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003069 report_data, "vkCreateGraphicsPipelines",
3070 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3071 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3072 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003073
3074 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003075 report_data, "vkCreateGraphicsPipelines",
3076 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3077 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3078 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003079
3080 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003081 report_data, "vkCreateGraphicsPipelines",
3082 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3083 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3084 pCreateInfos[i].pDepthStencilState->front.compareOp);
3085
3086 skip_call |= validate_ranged_enum(
3087 report_data, "vkCreateGraphicsPipelines",
3088 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003089 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3090
3091 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003092 report_data, "vkCreateGraphicsPipelines",
3093 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003094 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3095
3096 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003097 report_data, "vkCreateGraphicsPipelines",
3098 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3099 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3100 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003101
3102 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003103 report_data, "vkCreateGraphicsPipelines",
3104 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3105 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3106 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003107
3108 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3109 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3110 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3111 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3112 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3113 i);
3114 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003115 }
3116
3117 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3118 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003119 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003120 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3121 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3122 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003123
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003124 skip_call |= validate_reserved_flags(
3125 report_data, "vkCreateGraphicsPipelines",
3126 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3127 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003128
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003129 skip_call |= validate_bool32(
3130 report_data, "vkCreateGraphicsPipelines",
3131 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3132 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003133
3134 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003135 report_data, "vkCreateGraphicsPipelines",
3136 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3137 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3138 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003139
3140 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3141 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3142 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003143 skip_call |=
3144 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3145 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3146 ParameterName::IndexVector{i, attachmentIndex}),
3147 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003148
3149 skip_call |= validate_ranged_enum(
3150 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003151 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3152 ParameterName::IndexVector{i, attachmentIndex}),
3153 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003154 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3155
3156 skip_call |= validate_ranged_enum(
3157 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003158 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3159 ParameterName::IndexVector{i, attachmentIndex}),
3160 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003161 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3162
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003163 skip_call |=
3164 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3165 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3166 ParameterName::IndexVector{i, attachmentIndex}),
3167 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3168 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003169
3170 skip_call |= validate_ranged_enum(
3171 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003172 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3173 ParameterName::IndexVector{i, attachmentIndex}),
3174 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003175 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3176
3177 skip_call |= validate_ranged_enum(
3178 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003179 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3180 ParameterName::IndexVector{i, attachmentIndex}),
3181 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003182 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3183
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003184 skip_call |=
3185 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3186 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3187 ParameterName::IndexVector{i, attachmentIndex}),
3188 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3189 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003190
3191 skip_call |=
3192 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003193 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3194 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003195 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3196 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3197 }
3198 }
3199
Dustin Gravesc900f572016-05-16 11:07:59 -06003200 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3201 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3202 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3203 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3204 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3205 i);
3206 }
3207
3208 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3209 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3210 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003211 report_data, "vkCreateGraphicsPipelines",
3212 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003213 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3214 }
3215 }
3216 }
3217 }
3218
3219 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003220 PreCreateGraphicsPipelines(device, pCreateInfos);
3221
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003222 result = get_dispatch_table(pc_device_table_map, device)
3223 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003224
Dustin Gravesc900f572016-05-16 11:07:59 -06003225 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003226 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003227
3228 return result;
3229}
3230
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003231bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003232 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3233
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003234 if (pCreateInfos != nullptr) {
3235 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003236 uint32_t i = 0;
3237 validate_string(data->report_data, "vkCreateComputePipelines",
3238 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003239 }
3240
3241 return true;
3242}
3243
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003244VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3245 const VkComputePipelineCreateInfo *pCreateInfos,
3246 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003247 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003248 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003250 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003251
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003252 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3253 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003254
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003255 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003256 PreCreateComputePipelines(device, pCreateInfos);
3257
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003258 result = get_dispatch_table(pc_device_table_map, device)
3259 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003260
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003261 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003262 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003263
3264 return result;
3265}
3266
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003267VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3268 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003270 assert(my_data != NULL);
3271
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003272 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003273
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003274 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003275 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003276 }
3277}
3278
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003279VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3280 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003281 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003282 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003283 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003284 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003285
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003286 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003287
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003288 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003289 result =
3290 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003291
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003292 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003293 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003294
3295 return result;
3296}
3297
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003298VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3299 const VkAllocationCallbacks *pAllocator) {
3300 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003301 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003302 assert(my_data != NULL);
3303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003304 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003306 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003308 }
3309}
3310
Chia-I Wu01ca2372016-05-13 14:37:49 +08003311VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3312 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003313 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003314 bool skip_call = false;
3315 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3316 assert(device_data != NULL);
3317 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003318
Dustin Gravesc900f572016-05-16 11:07:59 -06003319 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003320
Dustin Gravesc900f572016-05-16 11:07:59 -06003321 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3322 if (pCreateInfo != nullptr) {
3323 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3324 if (pCreateInfo->compareEnable == VK_TRUE) {
3325 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3326 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3327 }
3328
3329 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3330 // valid VkBorderColor value
3331 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3332 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3333 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3334 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3335 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3336 }
3337 }
3338
3339 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003340 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3341
Dustin Gravesc900f572016-05-16 11:07:59 -06003342 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003343 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003344
3345 return result;
3346}
3347
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003348VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3349 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003350 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003351 assert(my_data != NULL);
3352
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003353 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003354
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003355 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003356 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003357 }
3358}
3359
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003360VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3361 const VkAllocationCallbacks *pAllocator,
3362 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003363 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003364 bool skip_call = false;
3365 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3366 assert(device_data != nullptr);
3367 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003368
Dustin Gravesc900f572016-05-16 11:07:59 -06003369 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003370
Dustin Gravesc900f572016-05-16 11:07:59 -06003371 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3372 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3373 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3374 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3375 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3376 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3377 // valid VkSampler handles
3378 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3379 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3380 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3381 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3382 ++descriptor_index) {
3383 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3384 skip_call |=
3385 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3386 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3387 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3388 " specified as VK_NULL_HANDLE",
3389 i, descriptor_index);
3390 }
3391 }
3392 }
3393
3394 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3395 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3396 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3397 skip_call |=
3398 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3399 UNRECOGNIZED_VALUE, LayerName,
3400 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3401 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3402 i, i);
3403 }
3404 }
3405 }
3406 }
3407
3408 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003409 result =
3410 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003411
Dustin Gravesc900f572016-05-16 11:07:59 -06003412 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003414
3415 return result;
3416}
3417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003418VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3419 const VkAllocationCallbacks *pAllocator) {
3420 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003421 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003422 assert(my_data != NULL);
3423
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003424 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003425
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003426 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003427 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003428 }
3429}
3430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003431VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3432 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003433 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003434 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003435 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003436 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003437
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003438 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003439
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003440 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3441
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003442 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003443 result =
3444 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003445
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003446 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003447 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003448
3449 return result;
3450}
3451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003452VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3453 const VkAllocationCallbacks *pAllocator) {
3454 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003455 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003456 assert(my_data != NULL);
3457
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003458 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003459
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003460 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003461 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003462 }
3463}
3464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003465VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3466 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003467 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003468 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003469 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3470 assert(my_data != NULL);
3471
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003472 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003473
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003474 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003475 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3476
3477 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3478 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003479
3480 return result;
3481}
3482
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003483VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3484 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003485 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003486 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003487 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003488 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003490 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003491
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003492 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003493 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3494
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003495 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003496 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003497
3498 return result;
3499}
3500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003501VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003502 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003503 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003504 bool skip_call = false;
3505 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3506 assert(device_data != nullptr);
3507 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003508
Dustin Gravesc900f572016-05-16 11:07:59 -06003509 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003510
Dustin Gravesc900f572016-05-16 11:07:59 -06003511 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3512 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3513 // validate_array()
3514 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3515 pDescriptorSets, true, true);
3516
3517 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003518 result = get_dispatch_table(pc_device_table_map, device)
3519 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003520
Dustin Gravesc900f572016-05-16 11:07:59 -06003521 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003522 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003523
3524 return result;
3525}
3526
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003527VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3528 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3529 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003530 bool skip_call = false;
3531 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3532 assert(device_data != NULL);
3533 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003534
Dustin Gravesc900f572016-05-16 11:07:59 -06003535 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3536 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003537
Dustin Gravesc900f572016-05-16 11:07:59 -06003538 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3539 if (pDescriptorWrites != NULL) {
3540 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3541 // descriptorCount must be greater than 0
3542 if (pDescriptorWrites[i].descriptorCount == 0) {
3543 skip_call |=
3544 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3545 REQUIRED_PARAMETER, LayerName,
3546 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3547 }
3548
3549 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3550 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3551 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3552 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3553 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3554 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3555 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3556 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3557 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3558 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3559 __LINE__, REQUIRED_PARAMETER, LayerName,
3560 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3561 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3562 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3563 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3564 i, i);
3565 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3566 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3567 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3568 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3569 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3570 ++descriptor_index) {
3571 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003572 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3573 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003574 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3575 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003576 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3577 ParameterName::IndexVector{i, descriptor_index}),
3578 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003579 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3580 }
3581 }
3582 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3583 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3584 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3585 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3586 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3587 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3588 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3589 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3590 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3591 __LINE__, REQUIRED_PARAMETER, LayerName,
3592 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3593 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3594 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3595 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3596 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003597 } else {
3598 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3599 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003600 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3601 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003602 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3603 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003604 }
3605 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3606 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3607 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3608 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3609 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3610 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3611 __LINE__, REQUIRED_PARAMETER, LayerName,
3612 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3613 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3614 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3615 i, i);
3616 } else {
3617 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3618 ++descriptor_index) {
3619 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003620 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3621 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003622 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3623 }
3624 }
3625 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003626
3627 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3628 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3629 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3630 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3631 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3632 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3633 skip_call |=
3634 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003635 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003636 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3637 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3638 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3639 }
3640 }
3641 }
3642 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3643 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3644 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3645 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3646 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3647 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3648 skip_call |=
3649 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003650 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003651 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3652 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3653 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3654 }
3655 }
3656 }
3657 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003658 }
3659 }
3660
3661 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003662 get_dispatch_table(pc_device_table_map, device)
3663 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003664 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003665}
3666
Chia-I Wu01ca2372016-05-13 14:37:49 +08003667VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003668 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003669 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003670 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003671 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003672 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003674 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003675
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003676 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003677 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3678
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003679 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003680 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003681
3682 return result;
3683}
3684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003685VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3686 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003687 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003688 assert(my_data != NULL);
3689
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003690 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003692 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003693 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003694 }
3695}
3696
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003697bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3698 bool skip_call = false;
3699 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3700
3701 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3702 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3703 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 -06003704 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003705 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3706 }
3707 }
3708 return skip_call;
3709}
3710
Chia-I Wu01ca2372016-05-13 14:37:49 +08003711VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003712 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003713 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003714 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003715 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003716 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003718 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3719 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003720
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003721 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003722 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3723
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003724 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003725 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003726
3727 return result;
3728}
3729
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003730VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3731 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003733 assert(my_data != NULL);
3734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003735 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003736
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003737 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003738 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003739 }
3740}
3741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003742VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3743 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003744 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003745 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003747 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003749 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003750 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003751 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003752}
3753
Chia-I Wu01ca2372016-05-13 14:37:49 +08003754VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003755 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003756 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003757 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003758 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003759 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003760
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003761 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003762 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003763
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003764 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003765
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003766 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003767 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3768
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003769 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003770 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003771
3772 return result;
3773}
3774
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003775VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3776 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003777 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003778 assert(my_data != NULL);
3779
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003780 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003782 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003783 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003784 }
3785}
3786
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003787VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003788 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003789 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003790 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3791 assert(my_data != NULL);
3792
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003793 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003794
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003795 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003796 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3797
3798 validate_result(my_data->report_data, "vkResetCommandPool", result);
3799 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003800
3801 return result;
3802}
3803
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003804VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3805 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003806 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003807 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003808 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003809 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003810
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003811 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003812
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003813 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003814 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3815
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003816 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003817 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003818
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003819 return result;
3820}
3821
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003822VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003823 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003824 bool skip_call = false;
3825 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3826 assert(device_data != nullptr);
3827 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003828
Dustin Gravesc900f572016-05-16 11:07:59 -06003829 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003830
Dustin Gravesc900f572016-05-16 11:07:59 -06003831 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3832 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3833 // validate_array()
3834 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3835 pCommandBuffers, true, true);
3836
3837 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003838 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003839 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003840 }
3841}
3842
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003843bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3844 bool skip_call = false;
3845 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3846 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3847
3848 if (pInfo != NULL) {
3849 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3850 skip_call |=
3851 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 -06003852 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003853 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3854 "inheritedQueries.");
3855 }
3856
3857 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3858 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3859 skip_call |=
3860 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 -06003861 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003862 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3863 "valid combination of VkQueryControlFlagBits.",
3864 pInfo->queryFlags);
3865 }
3866 }
3867 return skip_call;
3868}
3869
3870VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003871 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003872 bool skip_call = false;
3873 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3874 assert(device_data != nullptr);
3875 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003876
Dustin Gravesc900f572016-05-16 11:07:59 -06003877 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003878
Dustin Gravesc900f572016-05-16 11:07:59 -06003879 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3880 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3881 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3882 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3883 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3884
3885 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003886 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003887 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003888
3889 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3890 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3891
Dustin Gravesc900f572016-05-16 11:07:59 -06003892 // TODO: This only needs to be validated when the inherited queries feature is enabled
3893 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3894 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3895
3896 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3897 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3898 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3899 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3900 }
3901
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003902 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3903
Dustin Gravesc900f572016-05-16 11:07:59 -06003904 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003905 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3906
Dustin Gravesc900f572016-05-16 11:07:59 -06003907 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003908 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003909
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003910 return result;
3911}
3912
Chia-I Wu01ca2372016-05-13 14:37:49 +08003913VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003914 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3915 assert(my_data != NULL);
3916
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003917 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003918
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003919 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003920
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003921 return result;
3922}
3923
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003924VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003925 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003926 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3927 assert(my_data != NULL);
3928
Dustin Graves16d18972016-05-09 17:36:57 -06003929 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003930
Dustin Graves16d18972016-05-09 17:36:57 -06003931 if (!skip_call) {
3932 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3933
3934 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3935 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003936
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003937 return result;
3938}
3939
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003940VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3941 VkPipeline pipeline) {
3942 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003943 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3944 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003945
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003946 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003947
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003948 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003949 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3950 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003951}
3952
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003953bool preCmdSetViewport(debug_report_data *report_data, uint32_t viewport_count, const VkViewport *viewports) {
3954 bool skip =
3955 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
3956 return skip;
3957}
3958
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003959VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3960 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003961 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003962 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003963 assert(my_data != NULL);
3964
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003965 skip |= preCmdSetViewport(my_data->report_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003966
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003967 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003968 get_dispatch_table(pc_device_table_map, commandBuffer)
3969 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003970 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003971}
3972
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003973VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3974 const VkRect2D *pScissors) {
3975 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003976 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003977 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06003978 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07003979
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003980 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003981
Mike Weiblena4742dc2016-10-31 11:05:56 -06003982 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
3983 const VkRect2D &pScissor = pScissors[scissorIndex];
3984
3985 if (pScissor.offset.x < 0) {
3986 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3987 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
3988 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
3989 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
3990 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3991 VALIDATION_ERROR_01490, LayerName,
3992 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
3993 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
3994 }
3995
3996 if (pScissor.offset.y < 0) {
3997 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3998 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
3999 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4000 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
4001 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4002 VALIDATION_ERROR_01491, LayerName,
4003 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4004 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4005 }
4006 }
4007
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004008 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004009 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4010 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004011}
4012
Chia-I Wu01ca2372016-05-13 14:37:49 +08004013VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004014 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004015}
4016
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004017VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4018 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004019 get_dispatch_table(pc_device_table_map, commandBuffer)
4020 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004021}
4022
Chia-I Wu01ca2372016-05-13 14:37:49 +08004023VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004024 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004025 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004026 assert(my_data != NULL);
4027
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004028 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004029
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004030 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004031 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4032 }
Cody Northrop12365112015-08-17 11:10:49 -06004033}
4034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004035VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004036 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004037}
4038
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004039VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4040 uint32_t compareMask) {
4041 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004042 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4043 assert(my_data != NULL);
4044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004045 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004046
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004047 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004048 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4049 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004050}
4051
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004052VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4053 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004054 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4055 assert(my_data != NULL);
4056
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004057 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004059 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004060 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4061 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004062}
4063
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004064VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4065 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004066 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4067 assert(my_data != NULL);
4068
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004069 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004070
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004071 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004072 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4073 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004074}
4075
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004076VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4077 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4078 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4079 const uint32_t *pDynamicOffsets) {
4080 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004081 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004082 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004084 skip_call |=
4085 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4086 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004087
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004088 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004089 get_dispatch_table(pc_device_table_map, commandBuffer)
4090 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4091 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004092 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004093}
4094
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004095VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4096 VkIndexType indexType) {
4097 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004098 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4099 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004100
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004101 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004102
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004103 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004104 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4105 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004106}
4107
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004108VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4109 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4110 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004111 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004112 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004113
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004114 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004115
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004116 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004117 get_dispatch_table(pc_device_table_map, commandBuffer)
4118 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004119 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004120}
4121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004122bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4123 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004124 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004125 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004126 // 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 -07004127 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004128 log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004129 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004130 return false;
4131 }
4132
4133 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004134 // 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 -07004135 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004136 log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004137 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004138 return false;
4139 }
4140
4141 return true;
4142}
4143
Chia-I Wu01ca2372016-05-13 14:37:49 +08004144VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4145 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004146 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004147
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004148 get_dispatch_table(pc_device_table_map, commandBuffer)
4149 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004150}
4151
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004152VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4153 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004154 get_dispatch_table(pc_device_table_map, commandBuffer)
4155 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004156}
4157
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004158VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4159 uint32_t stride) {
4160 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4162 assert(my_data != NULL);
4163
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004164 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004165
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004166 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004167 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4168 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004169}
4170
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004171VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4172 uint32_t count, uint32_t stride) {
4173 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004174 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4175 assert(my_data != NULL);
4176
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004177 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004178
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004179 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004180 get_dispatch_table(pc_device_table_map, commandBuffer)
4181 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4182 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004183}
4184
Chia-I Wu01ca2372016-05-13 14:37:49 +08004185VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004186 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004187}
4188
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004189VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4190 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004191 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4192 assert(my_data != NULL);
4193
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004194 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004195
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004196 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004197 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4198 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004199}
4200
Chia-I Wu01ca2372016-05-13 14:37:49 +08004201VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4202 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004203 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004204 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004205 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004206
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004207 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004208
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004209 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004210 get_dispatch_table(pc_device_table_map, commandBuffer)
4211 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004212 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004213}
4214
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004215bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004216 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004217 if (pRegions != nullptr) {
4218 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4219 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004220 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004221 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004222 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4223 return false;
4224 }
4225 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4226 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004227 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004228 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004229 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4230 return false;
4231 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004232 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004233
4234 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004235}
4236
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004237VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4238 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4239 const VkImageCopy *pRegions) {
4240 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004241 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004242 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004243
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004244 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4245 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004246
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004247 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004248 PreCmdCopyImage(commandBuffer, pRegions);
4249
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004250 get_dispatch_table(pc_device_table_map, commandBuffer)
4251 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004252 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004253}
4254
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004255bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004256 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004257 if (pRegions != nullptr) {
4258 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4259 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004260 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004261 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004262 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4263 return false;
4264 }
4265 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4266 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004267 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004268 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004269 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4270 return false;
4271 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004272 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004273
4274 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004275}
4276
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004277VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4278 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4279 const VkImageBlit *pRegions, VkFilter filter) {
4280 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004281 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004282 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004283
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004284 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4285 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004286
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004287 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004288 PreCmdBlitImage(commandBuffer, pRegions);
4289
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004290 get_dispatch_table(pc_device_table_map, commandBuffer)
4291 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004292 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004293}
4294
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004295bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004296 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004297 if (pRegions != nullptr) {
4298 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4299 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004300 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004301 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004302 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4303 "enumerator");
4304 return false;
4305 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004306 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004307
4308 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004309}
4310
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004311VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4312 VkImageLayout dstImageLayout, uint32_t regionCount,
4313 const VkBufferImageCopy *pRegions) {
4314 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004315 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004316 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004317
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004318 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4319 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004320
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004321 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004322 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4323
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004324 get_dispatch_table(pc_device_table_map, commandBuffer)
4325 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004326 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004327}
4328
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004329bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004330 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004331 if (pRegions != nullptr) {
4332 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4333 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004334 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004335 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004336 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4337 "enumerator");
4338 return false;
4339 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004340 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004341
4342 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004343}
4344
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004345VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4346 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4347 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004348 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004349 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004350
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004351 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4352 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004353
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004354 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004355 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4356
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004357 get_dispatch_table(pc_device_table_map, commandBuffer)
4358 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004359 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004360}
4361
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004362VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4363 VkDeviceSize dataSize, const uint32_t *pData) {
4364 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004366 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004367
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004368 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004369
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004370 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004371 skip_call |= log_msg(
4372 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4373 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004374 }
4375
4376 if ((dataSize <= 0) || (dataSize > 65536)) {
4377 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 -06004378 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4379 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004380 dataSize);
4381 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004382 skip_call |= log_msg(
4383 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4384 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004385 }
4386
4387 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004388 get_dispatch_table(pc_device_table_map, commandBuffer)
4389 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004390 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004391}
4392
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004393VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4394 VkDeviceSize size, uint32_t data) {
4395 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004396 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4397 assert(my_data != NULL);
4398
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004399 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004400
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004401 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004402 skip_call |= log_msg(
4403 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4404 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004405 }
4406
4407 if (size != VK_WHOLE_SIZE) {
4408 if (size <= 0) {
4409 skip_call |= log_msg(
4410 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004411 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004412 } else if (size & 3) {
4413 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 -06004414 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004415 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4416 }
4417 }
4418
4419 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004420 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4421 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004422}
4423
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004424VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4425 const VkClearColorValue *pColor, uint32_t rangeCount,
4426 const VkImageSubresourceRange *pRanges) {
4427 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004429 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004431 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004432
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004433 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004434 get_dispatch_table(pc_device_table_map, commandBuffer)
4435 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004436 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004437}
4438
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004439VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4440 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4441 const VkImageSubresourceRange *pRanges) {
4442 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004443 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004444 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004446 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4447 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004448
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004449 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004450 get_dispatch_table(pc_device_table_map, commandBuffer)
4451 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004452 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004453}
4454
Chia-I Wu01ca2372016-05-13 14:37:49 +08004455VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4456 const VkClearAttachment *pAttachments, uint32_t rectCount,
4457 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004458 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004460 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004461
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004462 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004464 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004465 get_dispatch_table(pc_device_table_map, commandBuffer)
4466 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004467 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004468}
4469
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004470bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004471 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004472 if (pRegions != nullptr) {
4473 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4474 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4475 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004476 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004477 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004478 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4479 return false;
4480 }
4481 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4482 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4483 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004484 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004485 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004486 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4487 return false;
4488 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004489 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004490
4491 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004492}
4493
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004494VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4495 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4496 const VkImageResolve *pRegions) {
4497 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004498 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004499 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4502 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004503
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004504 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004505 PreCmdResolveImage(commandBuffer, pRegions);
4506
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004507 get_dispatch_table(pc_device_table_map, commandBuffer)
4508 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004509 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004510}
4511
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004512VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4513 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004514 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4515 assert(my_data != NULL);
4516
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004517 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004518
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004519 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004520 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4521 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004522}
4523
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004524VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4525 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004526 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4527 assert(my_data != NULL);
4528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004529 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004530
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004531 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004532 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4533 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004534}
4535
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004536VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4537 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4538 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4539 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4540 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4541 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004542 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004543 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004545 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4546 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4547 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004548
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004549 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004550 get_dispatch_table(pc_device_table_map, commandBuffer)
4551 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4552 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004553 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004554}
4555
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004556VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4557 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4558 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4559 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4560 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4561 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004562 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004563 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004565 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4566 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4567 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004568
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004569 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004570 get_dispatch_table(pc_device_table_map, commandBuffer)
4571 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4572 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004573 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004574}
4575
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004576VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4577 VkQueryControlFlags flags) {
4578 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004579 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4580 assert(my_data != NULL);
4581
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004582 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004583
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004584 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004585 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4586 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004587}
4588
Chia-I Wu01ca2372016-05-13 14:37:49 +08004589VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004590 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004591 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4592 assert(my_data != NULL);
4593
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004594 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004595
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004596 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004597 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004599}
4600
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004601VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4602 uint32_t queryCount) {
4603 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004604 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4605 assert(my_data != NULL);
4606
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004607 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004609 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004610 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4611 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004612}
4613
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004614bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4615 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004616
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004617 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004618
4619 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004620}
4621
Chia-I Wu01ca2372016-05-13 14:37:49 +08004622VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4623 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004624 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004625 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4626 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004627
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004628 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004629
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004630 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004631 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4632
4633 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4634 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004635}
4636
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004637VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4638 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4639 VkDeviceSize stride, VkQueryResultFlags flags) {
4640 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004641 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4642 assert(my_data != NULL);
4643
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004644 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4645 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004646
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004647 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004648 get_dispatch_table(pc_device_table_map, commandBuffer)
4649 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4650 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004651}
4652
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004653VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4654 uint32_t offset, uint32_t size, const void *pValues) {
4655 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004656 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004657 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004658
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004659 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004661 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004662 get_dispatch_table(pc_device_table_map, commandBuffer)
4663 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004664 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004665}
4666
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004667VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4668 VkSubpassContents contents) {
4669 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004671 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004673 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004674
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004675 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004676 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004677 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004678}
4679
Chia-I Wu01ca2372016-05-13 14:37:49 +08004680VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004681 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4683 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004685 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004686
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004687 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004688 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4689 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004690}
4691
Chia-I Wu01ca2372016-05-13 14:37:49 +08004692VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004693 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004694}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004695
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004696VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4697 const VkCommandBuffer *pCommandBuffers) {
4698 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004699 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004700 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004702 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004703
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004704 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004705 get_dispatch_table(pc_device_table_map, commandBuffer)
4706 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004707 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004708}
4709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004710VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004711 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4712}
4713
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004714VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4715 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004716 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4717}
4718
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004719VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4720 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004721 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4722 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4723
4724 return VK_ERROR_LAYER_NOT_PRESENT;
4725}
4726
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004727VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4728 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004729 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004730 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004731 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004732
4733 assert(physicalDevice);
4734
4735 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4736 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004737}
4738
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004739// WSI Extension Functions
4740
4741VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004742 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004743 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004744 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004745 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4746 assert(my_data != NULL);
4747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004748 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004750 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004751 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4752
4753 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4754 }
4755
4756 return result;
4757}
4758
4759VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004760 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004761 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004762 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004763 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4764 assert(my_data != NULL);
4765
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004766 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004767 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4768
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004769 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004770 result = get_dispatch_table(pc_device_table_map, device)
4771 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4772
4773 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4774 }
4775
4776 return result;
4777}
4778
4779VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004780 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004781 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004782 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004783 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4784 assert(my_data != NULL);
4785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004786 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004787 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004789 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004790 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004791 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004792
4793 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4794 }
4795
4796 return result;
4797}
4798
4799VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4800 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004801 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004802 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4803 assert(my_data != NULL);
4804
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004805 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004806
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004807 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004808 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4809
4810 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4811 }
4812
4813 return result;
4814}
4815
4816VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4817 VkSurfaceKHR surface, VkBool32 *pSupported) {
4818 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004819 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004820 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4821 assert(my_data != NULL);
4822
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004823 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004824 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4825
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004826 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004827 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4828 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4829
4830 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4831 }
4832
4833 return result;
4834}
4835
4836VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4837 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4838 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004839 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004840 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4841 assert(my_data != NULL);
4842
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004843 skip_call |=
4844 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004845
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004846 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004847 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4848 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4849
4850 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4851 }
4852
4853 return result;
4854}
4855
4856VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4857 uint32_t *pSurfaceFormatCount,
4858 VkSurfaceFormatKHR *pSurfaceFormats) {
4859 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004860 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004861 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4862 assert(my_data != NULL);
4863
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004864 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4865 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004867 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004868 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4869 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4870
4871 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4872 }
4873
4874 return result;
4875}
4876
4877VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4878 uint32_t *pPresentModeCount,
4879 VkPresentModeKHR *pPresentModes) {
4880 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004881 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004882 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4883 assert(my_data != NULL);
4884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004885 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4886 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004887
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004888 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004889 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4890 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4891
4892 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4893 }
4894
4895 return result;
4896}
4897
4898#ifdef VK_USE_PLATFORM_WIN32_KHR
4899VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4900 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4901 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4902
4903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4904 assert(my_data != NULL);
4905
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004906 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004907
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004908 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004909 result =
4910 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4911 }
4912
4913 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4914
4915 return result;
4916}
4917#endif // VK_USE_PLATFORM_WIN32_KHR
4918
4919#ifdef VK_USE_PLATFORM_XCB_KHR
4920VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4921 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4922 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4923
4924 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4925 assert(my_data != NULL);
4926
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004927 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004928
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004929 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004930 result =
4931 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4932 }
4933
4934 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4935
4936 return result;
4937}
4938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004939VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4940 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4941 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 VkBool32 result = false;
4943
4944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4945 assert(my_data != NULL);
4946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004947 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4948 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004950 if (!skip_call) {
4951 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4952 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953 }
4954
4955 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004956}
4957#endif // VK_USE_PLATFORM_XCB_KHR
4958
4959#ifdef VK_USE_PLATFORM_XLIB_KHR
4960VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004961 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004962 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4963
4964 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4965 assert(my_data != NULL);
4966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004967 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004968
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004969 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004970 result =
4971 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4972 }
4973
4974 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4975
4976 return result;
4977}
4978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004979VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4980 uint32_t queueFamilyIndex, Display *dpy,
4981 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004982 VkBool32 result = false;
4983
4984 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4985 assert(my_data != NULL);
4986
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004987 bool skip_call =
4988 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004990 if (!skip_call) {
4991 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4992 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004993 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06004994 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004995}
4996#endif // VK_USE_PLATFORM_XLIB_KHR
4997
4998#ifdef VK_USE_PLATFORM_MIR_KHR
4999VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005000 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005001 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5002
5003 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5004 assert(my_data != NULL);
5005
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005006 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005007
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005008 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005009 result =
5010 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5011 }
5012
5013 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5014
5015 return result;
5016}
5017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005018VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5019 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005020 VkBool32 result = false;
5021
5022 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5023 assert(my_data != NULL);
5024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005025 bool skip_call =
5026 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005027
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005028 if (!skip_call) {
5029 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5030 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005031 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005032}
5033#endif // VK_USE_PLATFORM_MIR_KHR
5034
5035#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5036VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005037 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005038 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5039
5040 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5041 assert(my_data != NULL);
5042
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005043 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005045 if (!skip_call) {
5046 result = get_dispatch_table(pc_instance_table_map, instance)
5047 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048 }
5049
5050 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5051
5052 return result;
5053}
5054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005055VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5056 uint32_t queueFamilyIndex,
5057 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005058 VkBool32 result = false;
5059
5060 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5061 assert(my_data != NULL);
5062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005063 bool skip_call =
5064 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005065
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005066 if (!skip_call) {
5067 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5068 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005069 }
5070}
5071#endif // VK_USE_PLATFORM_WAYLAND_KHR
5072
5073#ifdef VK_USE_PLATFORM_ANDROID_KHR
5074VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005075 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005076 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5077
5078 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5079 assert(my_data != NULL);
5080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005081 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005082
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005083 if (!skip_call) {
5084 result = get_dispatch_table(pc_instance_table_map, instance)
5085 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005086 }
5087
5088 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5089
5090 return result;
5091}
5092#endif // VK_USE_PLATFORM_ANDROID_KHR
5093
Mark Youngead9b932016-09-08 12:28:38 -06005094VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5095 const VkSwapchainCreateInfoKHR *pCreateInfos,
5096 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5097 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5098 bool skip_call = false;
5099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5100 assert(my_data != NULL);
5101
5102 skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
5103 pSwapchains);
5104
5105 if (!skip_call) {
5106 result = get_dispatch_table(pc_device_table_map, device)
5107 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5108
5109 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5110 }
5111
5112 return result;
5113}
5114
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005115// VK_EXT_debug_marker Extension
5116VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5117 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5118 bool skip_call = false;
5119 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5120 assert(my_data != NULL);
5121
5122 skip_call |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
5123
5124 if (!skip_call) {
5125 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5126
5127 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5128 }
5129
5130 return result;
5131}
5132
5133VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5134 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5135 bool skip_call = false;
5136 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5137 assert(my_data != NULL);
5138
5139 skip_call |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
5140
5141 if (!skip_call) {
5142 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5143
5144 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5145 }
5146
5147 return result;
5148}
5149
5150VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5151 bool skip_call = false;
5152 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5153 assert(my_data != NULL);
5154
5155 skip_call |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
5156
5157 if (!skip_call) {
5158 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5159 }
5160}
5161
5162VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5163 bool skip_call = false;
5164 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5165 assert(my_data != NULL);
5166
5167 skip_call |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
5168
5169 if (!skip_call) {
5170 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5171 }
5172}
5173
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005174// VK_NV_external_memory_capabilities Extension
5175VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5176 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5177 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5178 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5179
5180 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5181 bool skip_call = false;
5182 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5183 assert(my_data != NULL);
5184
5185 skip_call |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
5186 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5187
5188 if (!skip_call) {
5189 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5190 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5191 externalHandleType, pExternalImageFormatProperties);
5192
5193 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5194 }
5195
5196 return result;
5197}
5198
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005199#ifdef VK_USE_PLATFORM_WIN32_KHR
5200// VK_NV_external_memory_win32 Extension
5201VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5202 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5203
5204 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5205 bool skip_call = false;
5206 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5207 assert(my_data != NULL);
5208
5209 skip_call |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
5210
5211 if (!skip_call) {
5212 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5213 }
5214
5215 return result;
5216}
5217#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005218
5219
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005220
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005221static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005222
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005223static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005224
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005225static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005226
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005227static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005228
Chia-I Wu01ca2372016-05-13 14:37:49 +08005229VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005230 assert(device);
5231
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005232 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5233
Dustin Graves080069b2016-04-05 13:48:15 -06005234 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005235 return NULL;
5236 }
5237
Chia-I Wuf9b01382016-05-16 07:37:41 +08005238 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5239 if (proc)
5240 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005241
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005242 proc = InterceptWsiEnabledCommand(funcName, device);
5243 if (proc)
5244 return proc;
5245
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005246 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005247 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005248 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005249}
5250
Chia-I Wu01ca2372016-05-13 14:37:49 +08005251VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005252 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005253 if (!proc)
5254 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005255
5256 if (!proc)
5257 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005258
Chia-I Wu617f2a42016-05-16 07:41:17 +08005259 if (proc)
5260 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005261
Chia-I Wu617f2a42016-05-16 07:41:17 +08005262 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005263
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005264 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005265
Chia-I Wu617f2a42016-05-16 07:41:17 +08005266 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005267 if (!proc)
5268 proc = InterceptWsiEnabledCommand(funcName, instance);
5269
Chia-I Wu617f2a42016-05-16 07:41:17 +08005270 if (proc)
5271 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005272
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005273 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005274 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005275 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005276}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005278static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005279 static const struct {
5280 const char *name;
5281 PFN_vkVoidFunction proc;
5282 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005283 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5284 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5285 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5286 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5287 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5288 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5289 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5290 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5291 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5292 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5293 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5294 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5295 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5296 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5297 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5298 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5299 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005300 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005301 };
5302
5303 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5304 if (!strcmp(core_instance_commands[i].name, name))
5305 return core_instance_commands[i].proc;
5306 }
5307
5308 return nullptr;
5309}
5310
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005311static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005312 static const struct {
5313 const char *name;
5314 PFN_vkVoidFunction proc;
5315 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005316 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5317 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5318 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5319 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5320 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5321 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5322 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5323 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5324 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5325 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5326 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5327 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5328 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5329 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5330 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5331 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5332 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5333 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5334 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5335 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5336 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5337 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5338 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5339 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5340 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5341 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5342 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5343 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5344 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5345 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5346 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5347 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5348 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5349 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5350 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5351 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5352 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5353 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5354 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5355 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5356 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5357 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5358 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5359 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5360 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5361 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5362 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5363 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5364 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5365 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5366 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5367 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5368 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5369 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5370 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5371 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5372 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5373 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5374 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5375 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5376 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5377 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5378 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5379 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5380 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5381 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5382 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5383 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5384 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5385 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5386 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5387 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5388 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5389 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5390 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5391 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5392 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5393 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5394 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5395 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5396 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5397 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5398 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5399 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5400 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5401 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5402 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5403 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5404 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5405 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5406 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5407 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5408 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5409 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5410 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5411 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5412 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5413 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5414 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5415 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5416 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5417 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5418 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5419 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5420 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5421 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5422 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5423 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5424 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5425 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5426 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5427 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5428 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5429 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5430 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5431 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5432 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005433 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5434 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5435 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5436 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005437#ifdef VK_USE_PLATFORM_WIN32_KHR
5438 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5439#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005440};
5441
Chia-I Wuf9b01382016-05-16 07:37:41 +08005442
5443 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5444 if (!strcmp(core_device_commands[i].name, name))
5445 return core_device_commands[i].proc;
5446 }
5447
5448 return nullptr;
5449}
5450
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005451static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005452 static const struct {
5453 const char *name;
5454 PFN_vkVoidFunction proc;
5455 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005456 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5457 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5458 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5459 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005460 };
5461
5462 if (device) {
5463 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005464
Mark Youngead9b932016-09-08 12:28:38 -06005465 if (device_data->wsi_enabled) {
5466 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5467 if (!strcmp(wsi_device_commands[i].name, name))
5468 return wsi_device_commands[i].proc;
5469 }
5470 }
5471
5472 if (device_data->wsi_display_swapchain_enabled) {
5473 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5474 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
5475 }
5476 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005477 }
5478
5479 return nullptr;
5480}
5481
5482static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5483 static const struct {
5484 const char *name;
5485 PFN_vkVoidFunction proc;
5486 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005487 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5488 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5489 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5490 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5491 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5492 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005493 };
5494
5495 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005496 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005497 return nullptr;
5498
5499 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5500 if (!strcmp(wsi_instance_commands[i].name, name))
5501 return wsi_instance_commands[i].proc;
5502 }
5503
5504#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005505 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005506 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5507#endif // VK_USE_PLATFORM_WIN32_KHR
5508#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005509 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005510 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005511 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005512 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5513#endif // VK_USE_PLATFORM_XCB_KHR
5514#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005515 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005516 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005517 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005518 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5519#endif // VK_USE_PLATFORM_XLIB_KHR
5520#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005521 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005522 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005523 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005524 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5525#endif // VK_USE_PLATFORM_MIR_KHR
5526#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005527 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005528 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005529 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5530 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005531 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5532#endif // VK_USE_PLATFORM_WAYLAND_KHR
5533#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005534 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005535 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5536#endif // VK_USE_PLATFORM_ANDROID_KHR
5537
5538 return nullptr;
5539}
5540
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005541} // namespace parameter_validation
5542
5543// vk_layer_logging.h expects these to be defined
5544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005545VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5546 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5547 const VkAllocationCallbacks *pAllocator,
5548 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005549 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005550}
5551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005552VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5553 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005554 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005555}
5556
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005557VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5558 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5559 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005560 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005561}
5562
5563// loader-layer interface v0
5564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005565VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5566 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005567 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005568}
5569
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005570VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5571 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005572 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005573}
5574
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005575VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5576 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005577 // the layer command handles VK_NULL_HANDLE just fine internally
5578 assert(physicalDevice == VK_NULL_HANDLE);
5579 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005580}
5581
5582VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5583 const char *pLayerName, uint32_t *pCount,
5584 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005585 // the layer command handles VK_NULL_HANDLE just fine internally
5586 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005587 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005588}
5589
5590VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005591 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005592}
5593
5594VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005595 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005596}