blob: 36dd87dc095e4d73c83e11a10e8819291205e2ff [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>
Chris Forbesb93e59e2016-11-24 14:52:24 +130022 * Author: Chris Forbes <chrisforbes@google.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060023 */
24
Dustin Gravesf8032f22016-05-11 18:31:44 -060025#define NOMINMAX
26
Mike Weiblena4742dc2016-10-31 11:05:56 -060027#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060028#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060029#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32
33#include <iostream>
34#include <string>
35#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050036#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060037#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060038#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060039
Chris Forbesf90cef92016-11-29 09:49:19 +130040#include "vk_loader_platform.h"
41#include "vulkan/vk_layer.h"
42#include "vk_layer_config.h"
Chris Forbes6444bba2016-11-24 14:15:23 +130043#include "vk_dispatch_table_helper.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060044#include "vk_enum_validate_helper.h"
45#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060046
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060047#include "vk_layer_table.h"
48#include "vk_layer_data.h"
49#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060050#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070051#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060052
Dustin Graves8ffbbf62016-07-22 13:19:46 -060053#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060054#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070055
Chia-I Wu1a6b1932016-05-13 14:07:36 +080056namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060057
Chris Forbes7b58a712016-11-24 11:35:31 +130058struct instance_layer_data {
Chris Forbes7b57a392016-11-02 17:56:50 +130059 VkInstance instance = VK_NULL_HANDLE;
Chia-I Wua570b7c2016-05-16 07:48:14 +080060
Chris Forbes7b57a392016-11-02 17:56:50 +130061 debug_report_data *report_data = nullptr;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070062 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060063
Ian Elliotted6b5ac2016-04-28 09:08:13 -060064 // The following are for keeping track of the temporary callbacks that can
65 // be used in vkCreateInstance and vkDestroyInstance:
Chris Forbes7b57a392016-11-02 17:56:50 +130066 uint32_t num_tmp_callbacks = 0;
67 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos = nullptr;
68 VkDebugReportCallbackEXT *tmp_callbacks = nullptr;
Chris Forbes6be763e2016-11-24 12:42:33 +130069 instance_extension_enables extensions = {};
Chris Forbes6444bba2016-11-24 14:15:23 +130070
71 VkLayerInstanceDispatchTable dispatch_table = {};
Chris Forbes7b58a712016-11-24 11:35:31 +130072};
Ian Elliotted6b5ac2016-04-28 09:08:13 -060073
Chris Forbes7b58a712016-11-24 11:35:31 +130074struct layer_data {
Chris Forbes7b58a712016-11-24 11:35:31 +130075 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070076 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060077 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130078 VkPhysicalDeviceLimits device_limits = {};
79 VkPhysicalDeviceFeatures physical_device_features = {};
80 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Michael Lentinebdf744f2016-01-27 15:43:43 -060081
Chris Forbes7b57a392016-11-02 17:56:50 +130082 bool swapchain_enabled = false;
83 bool display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -060084 bool amd_negative_viewport_height_enabled = false;
Mark Youngfa552782016-12-12 16:14:55 -070085 bool nvx_device_generated_commands_enabled = false;
Chris Forbese58c9fe2016-11-24 14:44:17 +130086
87 VkLayerDispatchTable dispatch_table = {};
Cody Northrop55443ef2015-09-28 15:09:32 -060088};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050089
Jon Ashburn5484e0c2016-03-08 17:48:44 -070090static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +130091static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060092
Chris Forbes7b58a712016-11-24 11:35:31 +130093static void init_parameter_validation(instance_layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060094
Mark Lobodzinski739391a2016-03-17 15:08:18 -060095 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060096}
97
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060098VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
99 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
100 const VkAllocationCallbacks *pAllocator,
101 VkDebugReportCallbackEXT *pMsgCallback) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300102 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
103 VkResult result = data->dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600104
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700105 if (result == VK_SUCCESS) {
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600106 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600107 }
108
109 return result;
110}
111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600112VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800113 const VkAllocationCallbacks *pAllocator) {
Chris Forbes7b58a712016-11-24 11:35:31 +1300114 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300115 data->dispatch_table.DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
116
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700117 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600118}
119
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600120VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
121 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
122 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300123 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
124 data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700125}
126
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700127static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600128
Chia-I Wu3384db82016-05-16 07:30:58 +0800129static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600130 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800131};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700132
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700133static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600134 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700135 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
136 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
137 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
138 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
139 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 -0700140 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700141 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600142 return false;
143 }
144
145 return true;
146}
147
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700148static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
149 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600150 return "unrecognized enumerator";
151 }
152
153 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700154 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600155 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
156 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700157 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600158 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
159 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600161 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
162 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700163 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600164 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
165 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600167 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800185 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800188 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700191 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
192 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600193
194 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700195 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600196 enumeratorString += string;
197
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700198 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600199 enumeratorString += '|';
200 }
201 }
202
203 return enumeratorString;
204}
205
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700206static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
207 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
208 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
209 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
210 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
211 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600212 return false;
213 }
214
215 return true;
216}
217
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
219 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600220 return "unrecognized enumerator";
221 }
222
223 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700224 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600225 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
226 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700227 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600228 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600229 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700230 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600231 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
232 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700233 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600234 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
235 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700236 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600237 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
238 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800240 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700242 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
244 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800246 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600247 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600248
249 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700250 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600251 enumeratorString += string;
252
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700253 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600254 enumeratorString += '|';
255 }
256 }
257
258 return enumeratorString;
259}
260
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
262 VkQueueFlagBits allFlags =
263 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
264 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600265 return false;
266 }
267
268 return true;
269}
270
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
272 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600273 return "unrecognized enumerator";
274 }
275
276 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700277 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800278 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600279 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700280 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600281 strings.push_back("VK_QUEUE_COMPUTE_BIT");
282 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700283 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800284 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600285 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600287 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
288 }
289
290 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700291 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600292 enumeratorString += string;
293
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700294 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600295 enumeratorString += '|';
296 }
297 }
298
299 return enumeratorString;
300}
301
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700302static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
303 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
304 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
305 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
306 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600307 return false;
308 }
309
310 return true;
311}
312
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700313static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
314 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600315 return "unrecognized enumerator";
316 }
317
318 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700319 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600320 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
321 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700322 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800323 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700325 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600326 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
327 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700328 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800329 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600330 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800332 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600333 }
334
335 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700336 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600337 enumeratorString += string;
338
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700339 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600340 enumeratorString += '|';
341 }
342 }
343
344 return enumeratorString;
345}
346
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700348 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700349 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600350 return false;
351 }
352
353 return true;
354}
355
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
357 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 return "unrecognized enumerator";
359 }
360
361 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700362 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800363 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600364 }
365
366 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700367 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600368 enumeratorString += string;
369
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700370 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600371 enumeratorString += '|';
372 }
373 }
374
375 return enumeratorString;
376}
377
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700378static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
379 VkSparseImageFormatFlagBits allFlags =
380 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
381 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
382 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600383 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600384 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600385
386 return true;
387}
388
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700389static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
390 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600391 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600392 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600393
394 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700395 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800396 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600397 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700398 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800399 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600400 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700401 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800402 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600403 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600404
405 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700406 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600407 enumeratorString += string;
408
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700409 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600410 enumeratorString += '|';
411 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600413
414 return enumeratorString;
415}
416
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700418 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700419 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600420 return false;
421 }
422
423 return true;
424}
425
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700426static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
427 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 return "unrecognized enumerator";
429 }
430
431 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700432 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600433 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
434 }
435
436 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700437 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600438 enumeratorString += string;
439
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700440 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600441 enumeratorString += '|';
442 }
443 }
444
445 return enumeratorString;
446}
447
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700448static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
449 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
450 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
451 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
452 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
453 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600454 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
455 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
456 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700457 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600458 return false;
459 }
460
461 return true;
462}
463
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700464static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
465 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600466 return "unrecognized enumerator";
467 }
468
469 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700470 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700471 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600472 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700473 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700474 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600475 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700476 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700477 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700479 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700480 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600481 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700483 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600484 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700485 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700486 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600502 }
503
504 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700505 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600506 enumeratorString += string;
507
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700508 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600509 enumeratorString += '|';
510 }
511 }
512
513 return enumeratorString;
514}
515
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700516static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
517 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
518 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
519 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600520 return false;
521 }
522
523 return true;
524}
525
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
527 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 return "unrecognized enumerator";
529 }
530
531 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700532 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600533 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
534 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700535 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600536 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
537 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700538 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600539 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
540 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700541 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600542 strings.push_back("VK_QUERY_RESULT_64_BIT");
543 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600544
545 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700546 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600547 enumeratorString += string;
548
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700549 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600550 enumeratorString += '|';
551 }
552 }
553
554 return enumeratorString;
555}
556
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700557static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
558 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
559 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
560 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
561 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
562 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600563 return false;
564 }
565
566 return true;
567}
568
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
570 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600571 return "unrecognized enumerator";
572 }
573
574 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600576 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
577 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600579 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
580 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700581 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600582 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
583 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700584 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600585 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
586 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600588 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
589 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800591 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600592 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800597 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
601 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602
603 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700604 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600605 enumeratorString += string;
606
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 enumeratorString += '|';
609 }
610 }
611
612 return enumeratorString;
613}
614
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700615static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
616 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
617 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
618 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600619 return false;
620 }
621
622 return true;
623}
624
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
626 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600627 return "unrecognized enumerator";
628 }
629
630 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700631 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600632 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
633 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700634 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600635 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
636 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700637 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600638 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639 }
640
641 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700642 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600643 enumeratorString += string;
644
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700645 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600646 enumeratorString += '|';
647 }
648 }
649
650 return enumeratorString;
651}
652
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700653static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
654 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
655 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
656 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
657 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600658 return false;
659 }
660
661 return true;
662}
663
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700664static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
665 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600666 return "unrecognized enumerator";
667 }
668
669 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700670 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600671 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
672 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700673 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600674 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
675 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700676 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600677 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
678 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700679 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600680 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
681 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600683 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600684 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600685
686 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700687 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600688 enumeratorString += string;
689
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700690 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600691 enumeratorString += '|';
692 }
693 }
694
695 return enumeratorString;
696}
697
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700698static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
699 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
700 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
701 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600702 return false;
703 }
704
705 return true;
706}
707
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
709 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 return "unrecognized enumerator";
711 }
712
713 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700714 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800715 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600716 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700717 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800718 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600719 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700720 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800721 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600722 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700723 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800724 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600725 }
726
727 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700728 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600729 enumeratorString += string;
730
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700731 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600732 enumeratorString += '|';
733 }
734 }
735
736 return enumeratorString;
737}
738
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700739static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
740 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
741 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
742 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600743 return false;
744 }
745
746 return true;
747}
748
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
750 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600751 return "unrecognized enumerator";
752 }
753
754 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700755 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600756 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
757 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700758 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600759 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
760 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700761 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600762 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600763 }
764
765 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700766 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600767 enumeratorString += string;
768
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700769 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600770 enumeratorString += '|';
771 }
772 }
773
774 return enumeratorString;
775}
776
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700777static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
778 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
779 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
780 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
781 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600782 return false;
783 }
784
785 return true;
786}
787
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700788static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
789 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600790 return "unrecognized enumerator";
791 }
792
793 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700794 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600795 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600796 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700797 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600798 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600799 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700800 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600801 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
802 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700803 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600804 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
805 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600807 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600808 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700809 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600810 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600811 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600814 }
815
816 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700817 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600818 enumeratorString += string;
819
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700820 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600821 enumeratorString += '|';
822 }
823 }
824
825 return enumeratorString;
826}
827
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800829 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700830 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
831 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
832 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
833 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
834 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
835 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 -0700836 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700837 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600838 return false;
839 }
840
841 return true;
842}
843
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700844static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
845 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600846 return "unrecognized enumerator";
847 }
848
849 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700850 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800851 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
852 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700853 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800854 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600855 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700856 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600857 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600858 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700859 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600860 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600861 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600863 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600864 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700866 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600867 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600869 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600875 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600881 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600884 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700887 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600896 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600899 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600900 }
901
902 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700903 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600904 enumeratorString += string;
905
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700906 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600907 enumeratorString += '|';
908 }
909 }
910
911 return enumeratorString;
912}
913
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800915 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700916 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
917 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
918 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
919 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
920 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 +0800921
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700922 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600923 return false;
924 }
925
926 return true;
927}
928
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700929static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
930 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600931 return "unrecognized enumerator";
932 }
933
934 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800936 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600937 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700938 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800939 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600940 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700941 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800942 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600943 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700944 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800945 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600946 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700947 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800948 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600949 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800951 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600952 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600985 }
986
987 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700988 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600989 enumeratorString += string;
990
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700991 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600992 enumeratorString += '|';
993 }
994 }
995
996 return enumeratorString;
997}
998
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1000 VkCommandPoolCreateFlagBits allFlags =
1001 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1002 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001003 return false;
1004 }
1005
1006 return true;
1007}
1008
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1010 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001011 return "unrecognized enumerator";
1012 }
1013
1014 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001015 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001016 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001017 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001019 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001020 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001021
1022 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001023 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001024 enumeratorString += string;
1025
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001026 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001027 enumeratorString += '|';
1028 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001029 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001030
1031 return enumeratorString;
1032}
1033
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001035 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001036 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001037 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001038 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039
1040 return true;
1041}
1042
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1044 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045 return "unrecognized enumerator";
1046 }
1047
1048 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001049 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001050 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001051 }
1052
1053 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001054 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001055 enumeratorString += string;
1056
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001057 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001058 enumeratorString += '|';
1059 }
1060 }
1061
1062 return enumeratorString;
1063}
1064
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001065static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1066 VkCommandBufferUsageFlags allFlags =
1067 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1068 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1069 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 return false;
1071 }
1072
1073 return true;
1074}
1075
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001076static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1077 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001078 return "unrecognized enumerator";
1079 }
1080
1081 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001082 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001083 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001084 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001085 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001086 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001087 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001088 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001089 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001090 }
1091
1092 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001093 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001094 enumeratorString += string;
1095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001096 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001097 enumeratorString += '|';
1098 }
1099 }
1100
1101 return enumeratorString;
1102}
1103
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001104static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001105 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001106 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 return false;
1108 }
1109
1110 return true;
1111}
1112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001113static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1114 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 return "unrecognized enumerator";
1116 }
1117
1118 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001120 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001121 }
1122
1123 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001124 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001125 enumeratorString += string;
1126
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001127 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001128 enumeratorString += '|';
1129 }
1130 }
1131
1132 return enumeratorString;
1133}
1134
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001135static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1136 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1137 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1138 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001139 return false;
1140 }
1141
1142 return true;
1143}
1144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1146 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001147 return "unrecognized enumerator";
1148 }
1149
1150 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001151 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001152 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1153 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001154 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001155 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1156 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001157 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001158 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1159 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001160 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001161 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1162 }
1163
1164 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001165 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001166 enumeratorString += string;
1167
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001168 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001169 enumeratorString += '|';
1170 }
1171 }
1172
1173 return enumeratorString;
1174}
1175
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001176static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001177 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001178 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001179 return false;
1180 }
1181
1182 return true;
1183}
1184
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1186 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001187 return "unrecognized enumerator";
1188 }
1189
1190 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001191 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001192 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001193 }
1194
1195 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001196 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001197 enumeratorString += string;
1198
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001199 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001200 enumeratorString += '|';
1201 }
1202 }
1203
1204 return enumeratorString;
1205}
1206
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001207static const int MaxParamCheckerStringLength = 256;
1208
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001209static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001210 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001211 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001212 assert(validateString != nullptr);
1213
Chris Forbes04b61da2016-11-03 09:53:59 +13001214 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001215
1216 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1217
1218 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001219 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001220 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001221
Chris Forbes04b61da2016-11-03 09:53:59 +13001222 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001223 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1224 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001225 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001226 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001227 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1228 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001229 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001230 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001231}
1232
Dustin Gravesde628532016-04-21 16:30:17 -06001233static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1234 uint32_t index) {
1235 assert(device_data != nullptr);
1236 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001237 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001238
1239 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001240 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001241 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001242 } else {
1243 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1244 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001245 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001246 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1247 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001248 function_name, parameter_name, index);
1249 return false;
1250 }
1251 }
1252
Chris Forbes04b61da2016-11-03 09:53:59 +13001253 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001254}
1255
1256static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1257 const uint32_t count, const uint32_t *indices) {
1258 assert(device_data != nullptr);
1259 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001260 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001261
1262 if (indices != nullptr) {
1263 for (uint32_t i = 0; i < count; i++) {
1264 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001265 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001266 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001267 } else {
1268 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1269 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001270 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001271 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1272 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001273 function_name, parameter_name, i, indices[i]);
1274 return false;
1275 }
1276 }
1277 }
1278 }
1279
Chris Forbes04b61da2016-11-03 09:53:59 +13001280 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001281}
1282
Chris Forbes6be763e2016-11-24 12:42:33 +13001283static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001284
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001285VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1286 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001287 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001288
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001289 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001290 assert(chain_info != nullptr);
1291 assert(chain_info->u.pLayerInfo != nullptr);
1292
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001293 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1294 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001295 if (fpCreateInstance == NULL) {
1296 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001297 }
1298
Dustin Graves842621d2016-03-03 14:17:08 -07001299 // Advance the link info for the next element on the chain
1300 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1301
1302 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001303
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001304 if (result == VK_SUCCESS) {
Chris Forbes7b58a712016-11-24 11:35:31 +13001305 auto my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), instance_layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001306 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001307
Chris Forbes6444bba2016-11-24 14:15:23 +13001308 layer_init_instance_dispatch_table(*pInstance, &my_instance_data->dispatch_table, fpGetInstanceProcAddr);
Chia-I Wua570b7c2016-05-16 07:48:14 +08001309 my_instance_data->instance = *pInstance;
Chris Forbes6444bba2016-11-24 14:15:23 +13001310 my_instance_data->report_data =
1311 debug_report_create_instance(&my_instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount,
1312 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001313
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001314 // Look for one or more debug report create info structures
1315 // and setup a callback(s) for each one found.
1316 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1317 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1318 if (my_instance_data->num_tmp_callbacks > 0) {
1319 // Setup the temporary callback(s) here to catch early issues:
1320 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1321 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1322 // Failure of setting up one or more of the callback.
1323 // Therefore, clean up and don't use those callbacks:
1324 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1325 my_instance_data->num_tmp_callbacks = 0;
1326 }
1327 }
1328 }
1329
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001330 init_parameter_validation(my_instance_data, pAllocator);
Chris Forbes6be763e2016-11-24 12:42:33 +13001331 CheckInstanceRegisterExtensions(pCreateInfo, my_instance_data);
Dustin Graves842621d2016-03-03 14:17:08 -07001332
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001333 // Ordinarily we'd check these before calling down the chain, but none of the layer
1334 // support is in place until now, if we survive we can report the issue now.
1335 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001336
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001337 if (pCreateInfo->pApplicationInfo) {
1338 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1339 validate_string(my_instance_data->report_data, "vkCreateInstance",
1340 "pCreateInfo->VkApplicationInfo->pApplicationName",
1341 pCreateInfo->pApplicationInfo->pApplicationName);
1342 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001343
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001344 if (pCreateInfo->pApplicationInfo->pEngineName) {
1345 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1346 pCreateInfo->pApplicationInfo->pEngineName);
1347 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001348 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001349
1350 // Disable the tmp callbacks:
1351 if (my_instance_data->num_tmp_callbacks > 0) {
1352 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1353 my_instance_data->tmp_callbacks);
1354 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001355 }
1356
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001357 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001358}
1359
Chia-I Wu01ca2372016-05-13 14:37:49 +08001360VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001361 // Grab the key before the instance is destroyed.
1362 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001363 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001364 auto my_data = get_my_data_ptr(key, instance_layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001365 assert(my_data != NULL);
1366
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001367 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1368 bool callback_setup = false;
1369 if (my_data->num_tmp_callbacks > 0) {
1370 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1371 my_data->tmp_callbacks)) {
1372 callback_setup = true;
1373 }
1374 }
1375
Chris Forbes04b61da2016-11-03 09:53:59 +13001376 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001377
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001378 // Disable and cleanup the temporary callback(s):
1379 if (callback_setup) {
1380 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1381 }
1382 if (my_data->num_tmp_callbacks > 0) {
1383 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1384 my_data->num_tmp_callbacks = 0;
1385 }
1386
Chris Forbes04b61da2016-11-03 09:53:59 +13001387 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001388 my_data->dispatch_table.DestroyInstance(instance, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001389
1390 // Clean up logging callback, if any
1391 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001392 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1393 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001394 my_data->logging_callback.pop_back();
1395 }
1396
Chris Forbes78a56b02016-11-02 16:13:01 +13001397 layer_debug_report_destroy_instance(my_data->report_data);
Chris Forbes6444bba2016-11-24 14:15:23 +13001398 instance_layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001399 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001400}
1401
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001402VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1403 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001404 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001405 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001406 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001407 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001408
Chris Forbes04b61da2016-11-03 09:53:59 +13001409 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001410
Chris Forbes04b61da2016-11-03 09:53:59 +13001411 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001412 result = my_data->dispatch_table.EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001413 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001414 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001415 return result;
1416}
1417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001418VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001419 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001420 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001421 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001422
Chris Forbes04b61da2016-11-03 09:53:59 +13001423 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001424
Chris Forbes04b61da2016-11-03 09:53:59 +13001425 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001426 my_data->dispatch_table.GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001427 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001428}
1429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001430VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1431 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001432 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001433 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001435
Chris Forbes04b61da2016-11-03 09:53:59 +13001436 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001437
Chris Forbes04b61da2016-11-03 09:53:59 +13001438 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001439 my_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001440 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001441}
1442
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001443VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1444 VkImageType type, VkImageTiling tiling,
1445 VkImageUsageFlags usage, VkImageCreateFlags flags,
1446 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001447 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001448 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001449 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001451
Chris Forbes04b61da2016-11-03 09:53:59 +13001452 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001453 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454
Chris Forbes04b61da2016-11-03 09:53:59 +13001455 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001456 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1457 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001458
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001459 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001460 }
Chia-I Wu17241042015-10-31 00:31:16 +08001461
1462 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001463}
1464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001465VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001466 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001467 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001469
Chris Forbes04b61da2016-11-03 09:53:59 +13001470 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471
Chris Forbes04b61da2016-11-03 09:53:59 +13001472 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001473 my_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001474 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001475}
1476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001477VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1478 uint32_t *pQueueFamilyPropertyCount,
1479 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001480 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001481 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001482 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001483
Chris Forbes04b61da2016-11-03 09:53:59 +13001484 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001485 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001486
Chris Forbes04b61da2016-11-03 09:53:59 +13001487 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001488 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount,
1489 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001491}
1492
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001493VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1494 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001495 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001496 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001497 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001498
Chris Forbes04b61da2016-11-03 09:53:59 +13001499 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001500
Chris Forbes04b61da2016-11-03 09:53:59 +13001501 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001502 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001503 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001504}
1505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001506void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1507 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001508 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001509
Chris Forbes7b58a712016-11-24 11:35:31 +13001510 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes0e0161a2016-11-02 16:21:28 +13001511
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001512 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1513 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1514 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001515 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 -06001516 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001517 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1518 "structure.",
1519 i);
1520 } else {
1521 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001522 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001523
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001524 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1525 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1526 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1527 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001528 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 -06001529 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001530 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1531 "between 0 and 1. Actual value is %f",
1532 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1533 }
1534 }
1535 }
1536
1537 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1538 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001539 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 -06001540 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001541 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1542 "of queue families.",
1543 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001544 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1545 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1546 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001547 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 -06001548 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001549 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1550 "queues for the given family index.",
1551 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001552 }
Michael Lentine774704f2016-01-27 13:36:46 -06001553 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001554 }
1555}
1556
Chris Forbes6be763e2016-11-24 12:42:33 +13001557static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001558
1559 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001560 auto name = pCreateInfo->ppEnabledExtensionNames[i];
1561
1562 if (strcmp(name, VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1563 instance_data->extensions.surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001564 }
1565#ifdef VK_USE_PLATFORM_XLIB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001566 if (strcmp(name, VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
1567 instance_data->extensions.xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001568 }
1569#endif
1570#ifdef VK_USE_PLATFORM_XCB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001571 if (strcmp(name, VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
1572 instance_data->extensions.xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001573 }
1574#endif
1575#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001576 if (strcmp(name, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
1577 instance_data->extensions.wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001578 }
1579#endif
1580#ifdef VK_USE_PLATFORM_MIR_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001581 if (strcmp(name, VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
1582 instance_data->extensions.mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001583 }
1584#endif
1585#ifdef VK_USE_PLATFORM_ANDROID_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001586 if (strcmp(name, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
1587 instance_data->extensions.android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001588 }
1589#endif
1590#ifdef VK_USE_PLATFORM_WIN32_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001591 if (strcmp(name, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
1592 instance_data->extensions.win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001593 }
1594#endif
Chris Forbes6be763e2016-11-24 12:42:33 +13001595 if (strcmp(name, VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
1596 instance_data->extensions.display_enabled = true;
Chris Forbes2e47f432016-11-03 10:18:18 +13001597 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001598 }
1599}
1600
1601static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1602 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001603 device_data->swapchain_enabled = false;
1604 device_data->display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001605 device_data->amd_negative_viewport_height_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001606
1607 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1608 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001609 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001610 }
Mark Youngead9b932016-09-08 12:28:38 -06001611 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001612 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001613 }
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001614 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME) == 0) {
1615 device_data->amd_negative_viewport_height_enabled = true;
1616 }
Mark Youngfa552782016-12-12 16:14:55 -07001617 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME) == 0) {
1618 device_data->nvx_device_generated_commands_enabled = true;
1619 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001620 }
1621}
1622
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001623void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001624 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001625
1626 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1627 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1628 my_device_data->queueFamilyIndexMap.insert(
1629 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1630 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001631 }
1632}
1633
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001634VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001635 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001636 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001637 * NOTE: We do not validate physicalDevice or any dispatchable
1638 * object as the first parameter. We couldn't get here if it was wrong!
1639 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001640
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001641 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001642 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001643 auto my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001644 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001645
Chris Forbes04b61da2016-11-03 09:53:59 +13001646 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001647
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001648 if (pCreateInfo != NULL) {
1649 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001650 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001651 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001652 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001653 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001654 }
Michael Lentine774704f2016-01-27 13:36:46 -06001655
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001656 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001657 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001658 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001659 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001660 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001661 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001662 }
1663
Chris Forbes04b61da2016-11-03 09:53:59 +13001664 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001665 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001666 assert(chain_info != nullptr);
1667 assert(chain_info->u.pLayerInfo != nullptr);
1668
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001669 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1670 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001671 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001672 if (fpCreateDevice == NULL) {
1673 return VK_ERROR_INITIALIZATION_FAILED;
1674 }
1675
1676 // Advance the link info for the next element on the chain
1677 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1678
1679 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001680
1681 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1682
1683 if (result == VK_SUCCESS) {
1684 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1685 assert(my_device_data != nullptr);
1686
1687 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Chris Forbese58c9fe2016-11-24 14:44:17 +13001688 layer_init_device_dispatch_table(*pDevice, &my_device_data->dispatch_table, fpGetDeviceProcAddr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001689
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001690 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1691
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001692 uint32_t count;
Chris Forbes6444bba2016-11-24 14:15:23 +13001693 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001694 std::vector<VkQueueFamilyProperties> properties(count);
Chris Forbes6444bba2016-11-24 14:15:23 +13001695 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001696
1697 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1698 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001699
1700 // Query and save physical device limits for this device
1701 VkPhysicalDeviceProperties device_properties = {};
Chris Forbes6444bba2016-11-24 14:15:23 +13001702 my_instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &device_properties);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001703 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001704 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001705
1706 // Save app-enabled features in this device's layer_data structure
1707 if (pCreateInfo->pEnabledFeatures) {
1708 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1709 } else {
1710 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1711 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001712 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001713 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001714
Jeremy Hayes99a96322015-06-26 12:48:09 -06001715 return result;
1716}
1717
Chia-I Wu01ca2372016-05-13 14:37:49 +08001718VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001719 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001720 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001721 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1722 assert(my_data != NULL);
1723
Chris Forbes04b61da2016-11-03 09:53:59 +13001724 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001725
Chris Forbes04b61da2016-11-03 09:53:59 +13001726 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001727 layer_debug_report_destroy_device(device);
1728
Jeremy Hayes99a96322015-06-26 12:48:09 -06001729#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001730 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001731#endif
1732
Chris Forbese58c9fe2016-11-24 14:44:17 +13001733 my_data->dispatch_table.DestroyDevice(device, pAllocator);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001734 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001735 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001736}
1737
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001738bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001739 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001740 assert(my_device_data != nullptr);
1741
Dustin Gravesde628532016-04-21 16:30:17 -06001742 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001743
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001744 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001745 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001746 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 -06001747 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001748 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1749 "was created.",
1750 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001751 return false;
1752 }
1753 return true;
1754}
1755
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001756VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001757 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001758 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001759 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001760
Chris Forbes04b61da2016-11-03 09:53:59 +13001761 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001762
Chris Forbes04b61da2016-11-03 09:53:59 +13001763 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001764 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1765
Chris Forbese58c9fe2016-11-24 14:44:17 +13001766 my_data->dispatch_table.GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001767 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001768}
1769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001770VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001772 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001773 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001774 assert(my_data != NULL);
1775
Chris Forbes04b61da2016-11-03 09:53:59 +13001776 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001777
Chris Forbes04b61da2016-11-03 09:53:59 +13001778 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001779 result = my_data->dispatch_table.QueueSubmit(queue, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001780
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001781 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001782 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001783
Jeremy Hayes99a96322015-06-26 12:48:09 -06001784 return result;
1785}
1786
Chia-I Wu01ca2372016-05-13 14:37:49 +08001787VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001788 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1789 assert(my_data != NULL);
1790
Chris Forbese58c9fe2016-11-24 14:44:17 +13001791 VkResult result = my_data->dispatch_table.QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001792
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001793 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001794
1795 return result;
1796}
1797
Chia-I Wu01ca2372016-05-13 14:37:49 +08001798VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001799 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1800 assert(my_data != NULL);
1801
Chris Forbese58c9fe2016-11-24 14:44:17 +13001802 VkResult result = my_data->dispatch_table.DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001803
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001804 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001805
1806 return result;
1807}
1808
Chia-I Wu01ca2372016-05-13 14:37:49 +08001809VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001810 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001812 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001813 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001814 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001815
Chris Forbes04b61da2016-11-03 09:53:59 +13001816 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817
Chris Forbes04b61da2016-11-03 09:53:59 +13001818 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001819 result = my_data->dispatch_table.AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001820
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001821 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001822 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001823
1824 return result;
1825}
1826
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001827VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001828 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001829 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001830 assert(my_data != NULL);
1831
Chris Forbes04b61da2016-11-03 09:53:59 +13001832 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001833
Chris Forbes04b61da2016-11-03 09:53:59 +13001834 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001835 my_data->dispatch_table.FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001836 }
1837}
1838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001839VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1840 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001842 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001843 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001844 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001845
Chris Forbes04b61da2016-11-03 09:53:59 +13001846 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847
Chris Forbes04b61da2016-11-03 09:53:59 +13001848 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001849 result = my_data->dispatch_table.MapMemory(device, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001851 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001852 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001853
1854 return result;
1855}
1856
Chia-I Wu01ca2372016-05-13 14:37:49 +08001857VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001858 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1860 assert(my_data != NULL);
1861
Chris Forbes04b61da2016-11-03 09:53:59 +13001862 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001863
Chris Forbes04b61da2016-11-03 09:53:59 +13001864 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001865 my_data->dispatch_table.UnmapMemory(device, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001866 }
1867}
1868
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001869VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1870 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001871 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001872 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001873 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001874 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001875
Chris Forbes04b61da2016-11-03 09:53:59 +13001876 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001877
Chris Forbes04b61da2016-11-03 09:53:59 +13001878 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001879 result = my_data->dispatch_table.FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001880
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001881 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001882 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001883
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001884 return result;
1885}
1886
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001887VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1888 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001889 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001890 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001891 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001892 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001893
Chris Forbes04b61da2016-11-03 09:53:59 +13001894 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001895
Chris Forbes04b61da2016-11-03 09:53:59 +13001896 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001897 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13001898 my_data->dispatch_table.InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001900 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001901 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001902
Tony Barbourb1250542015-04-16 19:23:13 -06001903 return result;
1904}
1905
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001906VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1907 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001908 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001909 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001910 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001911
Chris Forbes04b61da2016-11-03 09:53:59 +13001912 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001913
Chris Forbes04b61da2016-11-03 09:53:59 +13001914 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001915 my_data->dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001916 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001917}
1918
Chia-I Wu01ca2372016-05-13 14:37:49 +08001919VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1920 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001921 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001922 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001923 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1924 assert(my_data != NULL);
1925
Chris Forbes04b61da2016-11-03 09:53:59 +13001926 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001927
Chris Forbes04b61da2016-11-03 09:53:59 +13001928 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001929 result = my_data->dispatch_table.BindBufferMemory(device, buffer, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001930
1931 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1932 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001933
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001934 return result;
1935}
1936
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001937VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001938 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001939 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001940 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1941 assert(my_data != NULL);
1942
Chris Forbes04b61da2016-11-03 09:53:59 +13001943 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001944
Chris Forbes04b61da2016-11-03 09:53:59 +13001945 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001946 result = my_data->dispatch_table.BindImageMemory(device, image, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001947
1948 validate_result(my_data->report_data, "vkBindImageMemory", result);
1949 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001950
1951 return result;
1952}
1953
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001954VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1955 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001956 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001957 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001958 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001959
Chris Forbes04b61da2016-11-03 09:53:59 +13001960 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001961
Chris Forbes04b61da2016-11-03 09:53:59 +13001962 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001963 my_data->dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001964 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001965}
1966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001967VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001968 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001970 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001971
Chris Forbes04b61da2016-11-03 09:53:59 +13001972 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001973
Chris Forbes04b61da2016-11-03 09:53:59 +13001974 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001975 my_data->dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001976 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001977}
1978
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001979bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1980 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001981 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001982 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001983 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001984 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1985 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001986 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 -06001987 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001988 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1989 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001990 return false;
1991 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001992 }
1993
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994 return true;
1995}
1996
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001997VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1998 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001999 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002000 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002002
Chris Forbes04b61da2016-11-03 09:53:59 +13002003 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002004 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002005
Chris Forbes04b61da2016-11-03 09:53:59 +13002006 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002007 my_data->dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002008
2009 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2010 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002011}
2012
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002013bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2014 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2015 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes7b58a712016-11-24 11:35:31 +13002016 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002017 if (pProperties != nullptr) {
2018 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2019 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002020 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 -06002021 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002022 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2023 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002024 return false;
2025 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002026 }
2027
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002028 return true;
2029}
2030
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002031VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2032 VkImageType type, VkSampleCountFlagBits samples,
2033 VkImageUsageFlags usage, VkImageTiling tiling,
2034 uint32_t *pPropertyCount,
2035 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002036 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13002037 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002038 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002039
Chris Forbes04b61da2016-11-03 09:53:59 +13002040 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002041 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002042
Chris Forbes04b61da2016-11-03 09:53:59 +13002043 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13002044 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling,
2045 pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002046
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002047 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2048 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002049 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002050}
2051
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002052VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2053 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002054 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002055 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002056 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002057 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002058
Chris Forbes04b61da2016-11-03 09:53:59 +13002059 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002060
Chris Forbes04b61da2016-11-03 09:53:59 +13002061 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002062 result = my_data->dispatch_table.QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002064 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002065 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002066
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002067 return result;
2068}
2069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002070VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2071 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002072 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002073 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002074 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002075 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002076
Chris Forbes04b61da2016-11-03 09:53:59 +13002077 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002078
Chris Forbes04b61da2016-11-03 09:53:59 +13002079 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002080 result = my_data->dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002081
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002082 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002083 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002084
2085 return result;
2086}
2087
Chia-I Wu01ca2372016-05-13 14:37:49 +08002088VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002089 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002090 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002091 assert(my_data != NULL);
2092
Chris Forbes04b61da2016-11-03 09:53:59 +13002093 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002094
Chris Forbes04b61da2016-11-03 09:53:59 +13002095 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002096 my_data->dispatch_table.DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002097 }
2098}
2099
Chia-I Wu01ca2372016-05-13 14:37:49 +08002100VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002101 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002102 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002103 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002104 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002105
Chris Forbes04b61da2016-11-03 09:53:59 +13002106 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002107
Chris Forbes04b61da2016-11-03 09:53:59 +13002108 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002109 result = my_data->dispatch_table.ResetFences(device, fenceCount, pFences);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002110
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002111 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002112 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002113
2114 return result;
2115}
2116
Chia-I Wu01ca2372016-05-13 14:37:49 +08002117VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002118 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002119 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002120 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2121 assert(my_data != NULL);
2122
Chris Forbes04b61da2016-11-03 09:53:59 +13002123 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002124
Chris Forbes04b61da2016-11-03 09:53:59 +13002125 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002126 result = my_data->dispatch_table.GetFenceStatus(device, fence);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002127
2128 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2129 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002130
2131 return result;
2132}
2133
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002134VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2135 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002136 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002137 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002138 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002139 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002140
Chris Forbes04b61da2016-11-03 09:53:59 +13002141 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002142
Chris Forbes04b61da2016-11-03 09:53:59 +13002143 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002144 result = my_data->dispatch_table.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002145
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002146 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002147 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002148
2149 return result;
2150}
2151
Chia-I Wu01ca2372016-05-13 14:37:49 +08002152VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002153 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002154 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002155 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002156 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002157 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002158
Chris Forbes04b61da2016-11-03 09:53:59 +13002159 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002160
Chris Forbes04b61da2016-11-03 09:53:59 +13002161 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002162 result = my_data->dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002163
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002164 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002165 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002166
2167 return result;
2168}
2169
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002170VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002171 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002172 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002173 assert(my_data != NULL);
2174
Chris Forbes04b61da2016-11-03 09:53:59 +13002175 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002176
Chris Forbes04b61da2016-11-03 09:53:59 +13002177 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002178 my_data->dispatch_table.DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002179 }
2180}
2181
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002182VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2183 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002184 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002185 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002187 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002188
Chris Forbes04b61da2016-11-03 09:53:59 +13002189 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002190
Chris Forbes04b61da2016-11-03 09:53:59 +13002191 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002192 result = my_data->dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002193
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002194 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002195 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002196
2197 return result;
2198}
2199
Chia-I Wu01ca2372016-05-13 14:37:49 +08002200VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002201 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002202 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002203 assert(my_data != NULL);
2204
Chris Forbes04b61da2016-11-03 09:53:59 +13002205 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002206
Chris Forbes04b61da2016-11-03 09:53:59 +13002207 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002208 my_data->dispatch_table.DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002209 }
2210}
2211
Chia-I Wu01ca2372016-05-13 14:37:49 +08002212VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002213 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002214 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002215 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2216 assert(my_data != NULL);
2217
Chris Forbes04b61da2016-11-03 09:53:59 +13002218 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002219
Chris Forbes04b61da2016-11-03 09:53:59 +13002220 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002221 result = my_data->dispatch_table.GetEventStatus(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002222
2223 validate_result(my_data->report_data, "vkGetEventStatus", result);
2224 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002225
2226 return result;
2227}
2228
Chia-I Wu01ca2372016-05-13 14:37:49 +08002229VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002230 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002231 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002232 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2233 assert(my_data != NULL);
2234
Chris Forbes04b61da2016-11-03 09:53:59 +13002235 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002236
Chris Forbes04b61da2016-11-03 09:53:59 +13002237 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002238 result = my_data->dispatch_table.SetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002239
2240 validate_result(my_data->report_data, "vkSetEvent", result);
2241 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242
2243 return result;
2244}
2245
Chia-I Wu01ca2372016-05-13 14:37:49 +08002246VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002247 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002248 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2250 assert(my_data != NULL);
2251
Chris Forbes04b61da2016-11-03 09:53:59 +13002252 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002253
Chris Forbes04b61da2016-11-03 09:53:59 +13002254 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002255 result = my_data->dispatch_table.ResetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002256
2257 validate_result(my_data->report_data, "vkResetEvent", result);
2258 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002259
2260 return result;
2261}
2262
Chia-I Wu01ca2372016-05-13 14:37:49 +08002263VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002264 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002265 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002266 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002267 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2268 assert(device_data != nullptr);
2269 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002270
Chris Forbes04b61da2016-11-03 09:53:59 +13002271 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002272
Dustin Gravesc900f572016-05-16 11:07:59 -06002273 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2274 if (pCreateInfo != nullptr) {
2275 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2276 // VkQueryPipelineStatisticFlagBits values
2277 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2278 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002279 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002280 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2281 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2282 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2283 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2284 }
2285 }
2286
Chris Forbes04b61da2016-11-03 09:53:59 +13002287 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002288 result = device_data->dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002289
Dustin Gravesc900f572016-05-16 11:07:59 -06002290 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002292
2293 return result;
2294}
2295
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002296VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002297 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002298 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002299 assert(my_data != NULL);
2300
Chris Forbes04b61da2016-11-03 09:53:59 +13002301 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002302
Chris Forbes04b61da2016-11-03 09:53:59 +13002303 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002304 my_data->dispatch_table.DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002305 }
2306}
2307
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002308VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2309 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002310 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002311 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002312 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002313 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002314
Chris Forbes04b61da2016-11-03 09:53:59 +13002315 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002316 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002317
Chris Forbes04b61da2016-11-03 09:53:59 +13002318 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002319 result = my_data->dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002320
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002321 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002322 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002323
2324 return result;
2325}
2326
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002327VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2328 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002329 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002330 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002331 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2332 assert(device_data != nullptr);
2333 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002334
Karl Schultza9ef1e52016-10-06 17:53:48 -06002335 // TODO: Add check for VALIDATION_ERROR_00660
2336 // TODO: Add check for VALIDATION_ERROR_00661
2337 // TODO: Add check for VALIDATION_ERROR_00662
2338 // TODO: Add check for VALIDATION_ERROR_00670
2339 // TODO: Add check for VALIDATION_ERROR_00671
2340 // TODO: Add check for VALIDATION_ERROR_00672
2341 // TODO: Add check for VALIDATION_ERROR_00673
2342 // TODO: Add check for VALIDATION_ERROR_00674
2343 // TODO: Add check for VALIDATION_ERROR_00675
2344 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2345 // TODO: Add check for VALIDATION_ERROR_00663
Chris Forbes04b61da2016-11-03 09:53:59 +13002346 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002347
Dustin Gravesc900f572016-05-16 11:07:59 -06002348 if (pCreateInfo != nullptr) {
2349 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2350 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2351 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2352 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002353 skip |= 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 -06002354 __LINE__, VALIDATION_ERROR_00665, LayerName,
2355 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2356 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2357 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002358 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002359
Dustin Gravesc900f572016-05-16 11:07:59 -06002360 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2361 // queueFamilyIndexCount uint32_t values
2362 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002363 skip |= 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 -06002364 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002365 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2366 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002367 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2368 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002369 }
2370
2371 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002372 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesc900f572016-05-16 11:07:59 -06002373 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2374 }
2375 }
2376
Chris Forbes04b61da2016-11-03 09:53:59 +13002377 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002378 result = device_data->dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002379
Dustin Gravesc900f572016-05-16 11:07:59 -06002380 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002381 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002382
2383 return result;
2384}
2385
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002386VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002387 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002388 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002389 assert(my_data != NULL);
2390
Chris Forbes04b61da2016-11-03 09:53:59 +13002391 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002392
Chris Forbes04b61da2016-11-03 09:53:59 +13002393 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002394 my_data->dispatch_table.DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002395 }
2396}
2397
Chia-I Wu01ca2372016-05-13 14:37:49 +08002398VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2399 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002400 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002401 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002402 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002403 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002404
Chris Forbes04b61da2016-11-03 09:53:59 +13002405 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002406
Chris Forbes04b61da2016-11-03 09:53:59 +13002407 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002408 result = my_data->dispatch_table.CreateBufferView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002409
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002410 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002411 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002412
2413 return result;
2414}
2415
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002416VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002417 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002419 assert(my_data != NULL);
2420
Chris Forbes04b61da2016-11-03 09:53:59 +13002421 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002422
Chris Forbes04b61da2016-11-03 09:53:59 +13002423 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002424 my_data->dispatch_table.DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002425 }
2426}
2427
Chia-I Wu01ca2372016-05-13 14:37:49 +08002428VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2429 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002430 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002431 bool skip = false;
Dustin Gravesf8032f22016-05-11 18:31:44 -06002432 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002433 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002434 debug_report_data *report_data = device_data->report_data;
2435
Chris Forbes04b61da2016-11-03 09:53:59 +13002436 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002437
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002438 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002439 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002440 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002441 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2442 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002443 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002444 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2445 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2446 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2447 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002448
Dustin Gravesc900f572016-05-16 11:07:59 -06002449 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2450 // queueFamilyIndexCount uint32_t values
2451 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002452 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002453 __LINE__, REQUIRED_PARAMETER, LayerName,
2454 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2455 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2456 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2457 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002458
Chris Forbes04b61da2016-11-03 09:53:59 +13002459 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesf8032f22016-05-11 18:31:44 -06002460 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2461 }
2462
2463 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002464 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2465 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002466 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002467 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002468
2469 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002470 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002471
2472 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002473 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002474
2475 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2476 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002477 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002479 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002480 }
2481
2482 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2483 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2484 // extent.height must be equal
2485 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2486 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002487 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002488 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2489 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2490 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002491 }
2492
2493 if (pCreateInfo->extent.depth != 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002494 skip |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002495 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002496 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2497 }
2498 }
2499
2500 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2501 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2502 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002503 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002504 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2505 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2506 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002507 }
2508
2509 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2510 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2511 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2512 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002513 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002514 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2515 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2516 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002517 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002518 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002519
Chris Forbes04b61da2016-11-03 09:53:59 +13002520 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002521 result = device_data->dispatch_table.CreateImage(device, pCreateInfo, pAllocator, pImage);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002522
Dustin Gravesf8032f22016-05-11 18:31:44 -06002523 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002524 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002526 return result;
2527}
2528
Chia-I Wu01ca2372016-05-13 14:37:49 +08002529VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002530 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002531 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002532 assert(my_data != NULL);
2533
Chris Forbes04b61da2016-11-03 09:53:59 +13002534 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002535
Chris Forbes04b61da2016-11-03 09:53:59 +13002536 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002537 my_data->dispatch_table.DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002538 }
2539}
2540
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002541bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002542 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002543 if (pSubresource != nullptr) {
2544 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2545 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002546 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 -06002547 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002548 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2549 return false;
2550 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002551 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002552
2553 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002554}
2555
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002556VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2557 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002558 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002559 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002560 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002561
Chris Forbes04b61da2016-11-03 09:53:59 +13002562 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002563
Chris Forbes04b61da2016-11-03 09:53:59 +13002564 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002565 PreGetImageSubresourceLayout(device, pSubresource);
2566
Chris Forbese58c9fe2016-11-24 14:44:17 +13002567 my_data->dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002568 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002569}
2570
Chia-I Wu01ca2372016-05-13 14:37:49 +08002571VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2572 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002573 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002574 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002575 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002576 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002577 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002578
Chris Forbes04b61da2016-11-03 09:53:59 +13002579 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002580
Dustin Graves0b70a632016-04-27 17:44:56 -06002581 if (pCreateInfo != nullptr) {
2582 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002583 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2584 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002585 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002586 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2587 "pCreateInfo->subresourceRange.layerCount must be 1",
2588 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2589 }
2590 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002591 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2592 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2593 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002594 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002595 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2596 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2597 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2598 }
2599 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002600 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2601 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002602 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002603 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2604 "pCreateInfo->subresourceRange.layerCount must be 6");
2605 }
2606 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002607 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2608 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002609 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002610 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2611 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2612 }
2613 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2614 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002615 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002616 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2617 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2618 }
2619
Dustin Graves2a80dc62016-07-12 13:57:02 -06002620 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2621 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002622 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002623 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2624 "pCreateInfo->subresourceRange.layerCount must be 1");
2625 }
2626 }
2627 }
2628
Chris Forbes04b61da2016-11-03 09:53:59 +13002629 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002630 result = my_data->dispatch_table.CreateImageView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002631
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002632 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002633 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002634
2635 return result;
2636}
2637
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002638VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002639 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002640 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002641 assert(my_data != NULL);
2642
Chris Forbes04b61da2016-11-03 09:53:59 +13002643 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002644
Chris Forbes04b61da2016-11-03 09:53:59 +13002645 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002646 my_data->dispatch_table.DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002647 }
2648}
2649
Chia-I Wu01ca2372016-05-13 14:37:49 +08002650VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002651 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002652 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002653 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002654 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002655 assert(my_data != NULL);
2656
Chris Forbes04b61da2016-11-03 09:53:59 +13002657 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002658
Chris Forbes04b61da2016-11-03 09:53:59 +13002659 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002660 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002661 my_data->dispatch_table.CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002663 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002664 }
2665
Michael Lentine03d8e572015-09-15 14:59:14 -05002666 return result;
2667}
2668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002669VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2670 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002671 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002672 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002673 assert(my_data != NULL);
2674
Chris Forbes04b61da2016-11-03 09:53:59 +13002675 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002676
Chris Forbes04b61da2016-11-03 09:53:59 +13002677 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002678 my_data->dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002679 }
2680}
2681
Chia-I Wu01ca2372016-05-13 14:37:49 +08002682VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002683 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002685 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002687 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002688
Chris Forbes04b61da2016-11-03 09:53:59 +13002689 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002690
Chris Forbes04b61da2016-11-03 09:53:59 +13002691 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002692 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002693 my_data->dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002694
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002695 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002696 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002697
2698 return result;
2699}
2700
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002701VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2702 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002703 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002704 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002705 assert(my_data != NULL);
2706
Chris Forbes04b61da2016-11-03 09:53:59 +13002707 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002708
Chris Forbes04b61da2016-11-03 09:53:59 +13002709 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002710 my_data->dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002711 }
2712}
2713
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002714VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2715 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002716 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002717 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002718 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002719 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002720
Chris Forbes04b61da2016-11-03 09:53:59 +13002721 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002722
Chris Forbes04b61da2016-11-03 09:53:59 +13002723 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002724 result = my_data->dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002725
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002726 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002727 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002728
2729 return result;
2730}
2731
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002732VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2733 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002734 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002735 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002736 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002737 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002738
Chris Forbes04b61da2016-11-03 09:53:59 +13002739 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002740
Chris Forbes04b61da2016-11-03 09:53:59 +13002741 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002742 result = my_data->dispatch_table.MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002743
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002744 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002745 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002746
2747 return result;
2748}
2749
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002750bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002751 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2752
2753 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002754 if (pCreateInfos != nullptr) {
2755 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2756 if (pCreateInfos->basePipelineIndex != -1) {
2757 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002758 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002759 VALIDATION_ERROR_00526, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002760 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2761 "pCreateInfos->flags "
Mike Weiblen9858d962016-10-31 23:59:10 -06002762 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2763 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 return false;
2765 }
2766 }
2767
2768 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2769 if (pCreateInfos->basePipelineIndex != -1) {
2770 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002771 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002772 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002773 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2774 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06002775 "VK_NULL_HANDLE. %s",
2776 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002777 return false;
2778 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002779 }
2780 }
2781
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002783 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002784 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 -06002785 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002786 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2787 "unrecognized enumerator");
2788 return false;
2789 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002790
2791 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2792 (data->physical_device_features.fillModeNonSolid == false)) {
2793 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002794 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 -06002795 DEVICE_FEATURE, LayerName,
2796 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2797 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2798 return false;
2799 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002800 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002801
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002802 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002803 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002804 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2805 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002806 pCreateInfos[i].pStages[j].pName);
2807 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002808 }
2809
2810 return true;
2811}
2812
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002813VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2814 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2815 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002816 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002817 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002818 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2819 assert(device_data != nullptr);
2820 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002821
Chris Forbes04b61da2016-11-03 09:53:59 +13002822 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002823 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002824
Dustin Gravesc900f572016-05-16 11:07:59 -06002825 if (pCreateInfos != nullptr) {
2826 for (uint32_t i = 0; i < createInfoCount; ++i) {
2827 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2828 if (pCreateInfos[i].pTessellationState == nullptr) {
2829 if (pCreateInfos[i].pStages != nullptr) {
2830 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2831 // pTessellationState must not be NULL
2832 bool has_control = false;
2833 bool has_eval = false;
2834
2835 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2836 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2837 has_control = true;
2838 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2839 has_eval = true;
2840 }
2841 }
2842
2843 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002844 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002845 __LINE__, VALIDATION_ERROR_00536, LayerName,
2846 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2847 "control shader stage and a tessellation evaluation shader stage, "
2848 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
2849 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002850 }
2851 }
Dustin Graves629259b2016-05-30 16:14:27 -06002852 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002853 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002854 report_data, "vkCreateGraphicsPipelines",
2855 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2856 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002857
Chris Forbes04b61da2016-11-03 09:53:59 +13002858 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002859 report_data, "vkCreateGraphicsPipelines",
2860 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2861 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002862
2863 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002864 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002865 __LINE__, VALIDATION_ERROR_00538, LayerName,
2866 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2867 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
2868 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06002869 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002870 }
2871
2872 if (pCreateInfos[i].pViewportState == nullptr) {
2873 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2874 // valid VkPipelineViewportStateCreateInfo structure
2875 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2876 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002877 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002878 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002879 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002880 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06002881 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
2882 "%s",
2883 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002884 }
2885 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002886 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002887 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2888 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2889 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002890
Chris Forbes04b61da2016-11-03 09:53:59 +13002891 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002892 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2893 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002894 pCreateInfos[i].pViewportState->flags);
2895
Dustin Gravesc900f572016-05-16 11:07:59 -06002896 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002897 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002898 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2899 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2900 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2901 i);
2902 }
2903
2904 if (pCreateInfos[i].pDynamicState != nullptr) {
2905 bool has_dynamic_viewport = false;
2906 bool has_dynamic_scissor = false;
2907
2908 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2909 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2910 has_dynamic_viewport = true;
2911 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2912 has_dynamic_scissor = true;
2913 }
2914 }
2915
2916 // viewportCount must be greater than 0
2917 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2918 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002919 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002920 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002921 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2922 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002923 "must be greater than 0",
2924 i, i);
2925 }
2926
2927 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2928 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2929 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002930 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002931 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002932 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002933 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002934 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
2935 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002936 }
2937
2938 // scissorCount must be greater than 0
2939 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2940 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002941 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002942 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002943 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2944 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002945 "must be greater than 0",
2946 i, i);
2947 }
2948
2949 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2950 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2951 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002952 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002953 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002954 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002955 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002956 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
2957 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002958 }
2959 }
2960 }
2961
2962 if (pCreateInfos[i].pMultisampleState == nullptr) {
2963 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2964 // a valid VkPipelineMultisampleStateCreateInfo structure
2965 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2966 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06002967 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2968 __LINE__, VALIDATION_ERROR_02114, LayerName,
2969 "vkCreateGraphicsPipelines: if "
2970 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2971 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
2972 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002973 }
Dustin Graves629259b2016-05-30 16:14:27 -06002974 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002975 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002976 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2977 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002978 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002979
Chris Forbes04b61da2016-11-03 09:53:59 +13002980 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002981 report_data, "vkCreateGraphicsPipelines",
2982 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2983 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002984
Chris Forbes04b61da2016-11-03 09:53:59 +13002985 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002986 report_data, "vkCreateGraphicsPipelines",
2987 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
2988 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002989
Chris Forbes04b61da2016-11-03 09:53:59 +13002990 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002991 report_data, "vkCreateGraphicsPipelines",
2992 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
2993 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
2994 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
2995 false);
Dustin Graves629259b2016-05-30 16:14:27 -06002996
Chris Forbes04b61da2016-11-03 09:53:59 +13002997 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002998 report_data, "vkCreateGraphicsPipelines",
2999 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3000 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003001
Chris Forbes04b61da2016-11-03 09:53:59 +13003002 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003003 report_data, "vkCreateGraphicsPipelines",
3004 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3005 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003006
3007 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003008 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003009 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3010 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3011 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3012 i);
3013 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003014 }
3015
3016 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003017 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003018 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003019 report_data, "vkCreateGraphicsPipelines",
3020 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3021 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003022
Chris Forbes04b61da2016-11-03 09:53:59 +13003023 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003024 report_data, "vkCreateGraphicsPipelines",
3025 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3026 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003027
Chris Forbes04b61da2016-11-03 09:53:59 +13003028 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003029 report_data, "vkCreateGraphicsPipelines",
3030 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3031 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003032
Chris Forbes04b61da2016-11-03 09:53:59 +13003033 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003034 report_data, "vkCreateGraphicsPipelines",
3035 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3036 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003037
Chris Forbes04b61da2016-11-03 09:53:59 +13003038 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003039 report_data, "vkCreateGraphicsPipelines",
3040 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3041 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3042 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003043
Chris Forbes04b61da2016-11-03 09:53:59 +13003044 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003045 report_data, "vkCreateGraphicsPipelines",
3046 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3047 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003048
Chris Forbes04b61da2016-11-03 09:53:59 +13003049 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003050 report_data, "vkCreateGraphicsPipelines",
3051 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3052 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003053
Chris Forbes04b61da2016-11-03 09:53:59 +13003054 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003055 report_data, "vkCreateGraphicsPipelines",
3056 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3057 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3058 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003059
Chris Forbes04b61da2016-11-03 09:53:59 +13003060 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003061 report_data, "vkCreateGraphicsPipelines",
3062 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3063 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3064 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003065
Chris Forbes04b61da2016-11-03 09:53:59 +13003066 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003067 report_data, "vkCreateGraphicsPipelines",
3068 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3069 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3070 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003071
Chris Forbes04b61da2016-11-03 09:53:59 +13003072 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003073 report_data, "vkCreateGraphicsPipelines",
3074 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3075 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3076 pCreateInfos[i].pDepthStencilState->front.compareOp);
3077
Chris Forbes04b61da2016-11-03 09:53:59 +13003078 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003079 report_data, "vkCreateGraphicsPipelines",
3080 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003081 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3082
Chris Forbes04b61da2016-11-03 09:53:59 +13003083 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003084 report_data, "vkCreateGraphicsPipelines",
3085 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003086 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3087
Chris Forbes04b61da2016-11-03 09:53:59 +13003088 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003089 report_data, "vkCreateGraphicsPipelines",
3090 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3091 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3092 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003093
Chris Forbes04b61da2016-11-03 09:53:59 +13003094 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003095 report_data, "vkCreateGraphicsPipelines",
3096 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3097 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3098 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003099
3100 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003101 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003102 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3103 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3104 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3105 i);
3106 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003107 }
3108
3109 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3110 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003111 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003112 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3113 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3114 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003115
Chris Forbes04b61da2016-11-03 09:53:59 +13003116 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003117 report_data, "vkCreateGraphicsPipelines",
3118 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3119 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003120
Chris Forbes04b61da2016-11-03 09:53:59 +13003121 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003122 report_data, "vkCreateGraphicsPipelines",
3123 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3124 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003125
Chris Forbes04b61da2016-11-03 09:53:59 +13003126 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003127 report_data, "vkCreateGraphicsPipelines",
3128 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3129 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3130 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003131
3132 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3133 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3134 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003135 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003136 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3137 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3138 ParameterName::IndexVector{i, attachmentIndex}),
3139 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003140
Chris Forbes04b61da2016-11-03 09:53:59 +13003141 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003142 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003143 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3144 ParameterName::IndexVector{i, attachmentIndex}),
3145 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003146 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3147
Chris Forbes04b61da2016-11-03 09:53:59 +13003148 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003149 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003150 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3151 ParameterName::IndexVector{i, attachmentIndex}),
3152 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003153 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3154
Chris Forbes04b61da2016-11-03 09:53:59 +13003155 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003156 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3157 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3158 ParameterName::IndexVector{i, attachmentIndex}),
3159 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3160 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003161
Chris Forbes04b61da2016-11-03 09:53:59 +13003162 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003163 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003164 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3165 ParameterName::IndexVector{i, attachmentIndex}),
3166 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003167 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3168
Chris Forbes04b61da2016-11-03 09:53:59 +13003169 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003170 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003171 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3172 ParameterName::IndexVector{i, attachmentIndex}),
3173 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003174 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3175
Chris Forbes04b61da2016-11-03 09:53:59 +13003176 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003177 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3178 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3179 ParameterName::IndexVector{i, attachmentIndex}),
3180 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3181 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003182
Chris Forbes04b61da2016-11-03 09:53:59 +13003183 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003184 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003185 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3186 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003187 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3188 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3189 }
3190 }
3191
Dustin Gravesc900f572016-05-16 11:07:59 -06003192 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003193 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003194 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3195 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3196 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3197 i);
3198 }
3199
3200 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3201 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003202 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003203 report_data, "vkCreateGraphicsPipelines",
3204 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003205 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3206 }
3207 }
3208 }
3209 }
3210
Chris Forbes04b61da2016-11-03 09:53:59 +13003211 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003212 PreCreateGraphicsPipelines(device, pCreateInfos);
3213
Chris Forbese58c9fe2016-11-24 14:44:17 +13003214 result = device_data->dispatch_table.CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003215
Dustin Gravesc900f572016-05-16 11:07:59 -06003216 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003217 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003218
3219 return result;
3220}
3221
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003222bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003223 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3224
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003225 if (pCreateInfos != nullptr) {
3226 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003227 uint32_t i = 0;
3228 validate_string(data->report_data, "vkCreateComputePipelines",
3229 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003230 }
3231
3232 return true;
3233}
3234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003235VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3236 const VkComputePipelineCreateInfo *pCreateInfos,
3237 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003238 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003239 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003240 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003241 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003242
Chris Forbes04b61da2016-11-03 09:53:59 +13003243 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003244 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003245
Chris Forbes04b61da2016-11-03 09:53:59 +13003246 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003247 PreCreateComputePipelines(device, pCreateInfos);
3248
Chris Forbese58c9fe2016-11-24 14:44:17 +13003249 result = my_data->dispatch_table.CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003250
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003251 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003252 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003253
3254 return result;
3255}
3256
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003257VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003258 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003259 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003260 assert(my_data != NULL);
3261
Chris Forbes04b61da2016-11-03 09:53:59 +13003262 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003263
Chris Forbes04b61da2016-11-03 09:53:59 +13003264 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003265 my_data->dispatch_table.DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003266 }
3267}
3268
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003269VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3270 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003271 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003272 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003273 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003274 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003275
Chris Forbes04b61da2016-11-03 09:53:59 +13003276 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003277
Chris Forbes04b61da2016-11-03 09:53:59 +13003278 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003279 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003280 my_data->dispatch_table.CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003281
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003282 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003283 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003284
3285 return result;
3286}
3287
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003288VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3289 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003290 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003291 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003292 assert(my_data != NULL);
3293
Chris Forbes04b61da2016-11-03 09:53:59 +13003294 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003295
Chris Forbes04b61da2016-11-03 09:53:59 +13003296 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003297 my_data->dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003298 }
3299}
3300
Chia-I Wu01ca2372016-05-13 14:37:49 +08003301VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3302 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003303 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003304 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003305 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3306 assert(device_data != NULL);
3307 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003308
Chris Forbes04b61da2016-11-03 09:53:59 +13003309 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003310
Dustin Gravesc900f572016-05-16 11:07:59 -06003311 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3312 if (pCreateInfo != nullptr) {
3313 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3314 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003315 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003316 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3317 }
3318
3319 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3320 // valid VkBorderColor value
3321 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3322 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3323 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003324 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003325 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3326 }
3327 }
3328
Chris Forbes04b61da2016-11-03 09:53:59 +13003329 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003330 result = device_data->dispatch_table.CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003331
Dustin Gravesc900f572016-05-16 11:07:59 -06003332 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003333 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003334
3335 return result;
3336}
3337
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003338VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003339 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003340 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003341 assert(my_data != NULL);
3342
Chris Forbes04b61da2016-11-03 09:53:59 +13003343 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003344
Chris Forbes04b61da2016-11-03 09:53:59 +13003345 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003346 my_data->dispatch_table.DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003347 }
3348}
3349
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003350VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3351 const VkAllocationCallbacks *pAllocator,
3352 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003353 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003354 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003355 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3356 assert(device_data != nullptr);
3357 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003358
Chris Forbes04b61da2016-11-03 09:53:59 +13003359 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003360
Dustin Gravesc900f572016-05-16 11:07:59 -06003361 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3362 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3363 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3364 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3365 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3366 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3367 // valid VkSampler handles
3368 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3369 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3370 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3371 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3372 ++descriptor_index) {
3373 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003374 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003375 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3376 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3377 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3378 " specified as VK_NULL_HANDLE",
3379 i, descriptor_index);
3380 }
3381 }
3382 }
3383
3384 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3385 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3386 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003387 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003388 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3389 UNRECOGNIZED_VALUE, LayerName,
3390 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3391 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3392 i, i);
3393 }
3394 }
3395 }
3396 }
3397
Chris Forbes04b61da2016-11-03 09:53:59 +13003398 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003399 result = device_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003400
Dustin Gravesc900f572016-05-16 11:07:59 -06003401 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003402 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003403
3404 return result;
3405}
3406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003407VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3408 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003409 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003410 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003411 assert(my_data != NULL);
3412
Chris Forbes04b61da2016-11-03 09:53:59 +13003413 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003414
Chris Forbes04b61da2016-11-03 09:53:59 +13003415 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003416 my_data->dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003417 }
3418}
3419
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003420VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3421 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003422 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003423 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003424 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003425 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003426
Chris Forbes04b61da2016-11-03 09:53:59 +13003427 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003428
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003429 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3430
Chris Forbes04b61da2016-11-03 09:53:59 +13003431 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003432 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003433 my_data->dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003434
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003435 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003436 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003437
3438 return result;
3439}
3440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003441VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3442 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003443 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003444 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003445 assert(my_data != NULL);
3446
Chris Forbes04b61da2016-11-03 09:53:59 +13003447 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003448
Chris Forbes04b61da2016-11-03 09:53:59 +13003449 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003450 my_data->dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003451 }
3452}
3453
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003454VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3455 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003456 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003457 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003458 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3459 assert(my_data != NULL);
3460
Chris Forbes04b61da2016-11-03 09:53:59 +13003461 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003462
Chris Forbes04b61da2016-11-03 09:53:59 +13003463 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003464 result = my_data->dispatch_table.ResetDescriptorPool(device, descriptorPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003465
3466 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3467 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003468
3469 return result;
3470}
3471
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003472VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3473 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003474 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003475 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003476 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003477 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003478
Chris Forbes04b61da2016-11-03 09:53:59 +13003479 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003480
Chris Forbes04b61da2016-11-03 09:53:59 +13003481 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003482 result = my_data->dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003483
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003484 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003485 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003486
3487 return result;
3488}
3489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003490VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003491 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003492 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003493 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003494 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3495 assert(device_data != nullptr);
3496 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003497
Chris Forbes04b61da2016-11-03 09:53:59 +13003498 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003499
Dustin Gravesc900f572016-05-16 11:07:59 -06003500 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3501 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3502 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003503 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003504 pDescriptorSets, true, true);
3505
Chris Forbes04b61da2016-11-03 09:53:59 +13003506 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003507 result = device_data->dispatch_table.FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003508
Dustin Gravesc900f572016-05-16 11:07:59 -06003509 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003510 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003511
3512 return result;
3513}
3514
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003515VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3516 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3517 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003518 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003519 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3520 assert(device_data != NULL);
3521 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003522
Chris Forbes04b61da2016-11-03 09:53:59 +13003523 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003524 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003525
Dustin Gravesc900f572016-05-16 11:07:59 -06003526 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3527 if (pDescriptorWrites != NULL) {
3528 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3529 // descriptorCount must be greater than 0
3530 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003531 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003532 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3533 REQUIRED_PARAMETER, LayerName,
3534 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3535 }
3536
3537 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3538 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3539 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3540 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3541 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3542 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3543 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3544 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3545 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003546 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003547 __LINE__, REQUIRED_PARAMETER, LayerName,
3548 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3549 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3550 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3551 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3552 i, i);
3553 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3554 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3555 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3556 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3557 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3558 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003559 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003560 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3561 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003562 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003563 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003564 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3565 ParameterName::IndexVector{i, descriptor_index}),
3566 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003567 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3568 }
3569 }
3570 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3571 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3572 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3573 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3574 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3575 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3576 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3577 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003578 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003579 __LINE__, REQUIRED_PARAMETER, LayerName,
3580 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3581 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3582 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3583 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3584 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003585 } else {
3586 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003587 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003588 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3589 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003590 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3591 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003592 }
3593 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3594 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3595 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3596 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3597 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003598 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003599 __LINE__, REQUIRED_PARAMETER, LayerName,
3600 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3601 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3602 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3603 i, i);
3604 } else {
3605 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3606 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003607 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003608 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3609 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003610 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3611 }
3612 }
3613 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003614
3615 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3616 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3617 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3618 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3619 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3620 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003621 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003622 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003623 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003624 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3625 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3626 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3627 }
3628 }
3629 }
3630 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3631 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3632 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3633 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3634 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3635 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003636 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003637 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003638 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003639 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3640 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3641 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3642 }
3643 }
3644 }
3645 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003646 }
3647 }
3648
Chris Forbes04b61da2016-11-03 09:53:59 +13003649 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003650 device_data->dispatch_table.UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003651 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003652}
3653
Chia-I Wu01ca2372016-05-13 14:37:49 +08003654VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003655 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003656 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003657 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003659 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003660
Chris Forbes04b61da2016-11-03 09:53:59 +13003661 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003662
Chris Forbes04b61da2016-11-03 09:53:59 +13003663 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003664 result = my_data->dispatch_table.CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003665
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003666 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003667 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003668
3669 return result;
3670}
3671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003672VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003673 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003674 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003675 assert(my_data != NULL);
3676
Chris Forbes04b61da2016-11-03 09:53:59 +13003677 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003678
Chris Forbes04b61da2016-11-03 09:53:59 +13003679 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003680 my_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003681 }
3682}
3683
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003684bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003685 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003686 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3687
3688 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3689 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003690 skip |= 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 -06003691 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003692 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3693 }
3694 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003695 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003696}
3697
Chia-I Wu01ca2372016-05-13 14:37:49 +08003698VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003699 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003700 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003701 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003702 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003703 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003704
Chris Forbes04b61da2016-11-03 09:53:59 +13003705 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3706 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003707
Chris Forbes04b61da2016-11-03 09:53:59 +13003708 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003709 result = my_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003710
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003711 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003712 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003713
3714 return result;
3715}
3716
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003717VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003718 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003720 assert(my_data != NULL);
3721
Chris Forbes04b61da2016-11-03 09:53:59 +13003722 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003723
Chris Forbes04b61da2016-11-03 09:53:59 +13003724 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003725 my_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003726 }
3727}
3728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003729VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003730 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003731 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003732 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003733
Chris Forbes04b61da2016-11-03 09:53:59 +13003734 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003735
Chris Forbes04b61da2016-11-03 09:53:59 +13003736 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003737 my_data->dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003738 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003739}
3740
Chia-I Wu01ca2372016-05-13 14:37:49 +08003741VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003742 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003744 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003745 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003746 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003747
Chris Forbes04b61da2016-11-03 09:53:59 +13003748 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003749 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003750
Chris Forbes04b61da2016-11-03 09:53:59 +13003751 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003752
Chris Forbes04b61da2016-11-03 09:53:59 +13003753 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003754 result = my_data->dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003755
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003756 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003757 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003758
3759 return result;
3760}
3761
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003762VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003763 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003764 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003765 assert(my_data != NULL);
3766
Chris Forbes04b61da2016-11-03 09:53:59 +13003767 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003768
Chris Forbes04b61da2016-11-03 09:53:59 +13003769 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003770 my_data->dispatch_table.DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003771 }
3772}
3773
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003774VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003775 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003776 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003777 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3778 assert(my_data != NULL);
3779
Chris Forbes04b61da2016-11-03 09:53:59 +13003780 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003781
Chris Forbes04b61da2016-11-03 09:53:59 +13003782 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003783 result = my_data->dispatch_table.ResetCommandPool(device, commandPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003784
3785 validate_result(my_data->report_data, "vkResetCommandPool", result);
3786 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003787
3788 return result;
3789}
3790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003791VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3792 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003793 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003794 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003796 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003797
Chris Forbes04b61da2016-11-03 09:53:59 +13003798 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003799
Chris Forbes04b61da2016-11-03 09:53:59 +13003800 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003801 result = my_data->dispatch_table.AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003802
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003803 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003804 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003805
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003806 return result;
3807}
3808
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003809VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003810 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003811 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003812 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3813 assert(device_data != nullptr);
3814 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003815
Chris Forbes04b61da2016-11-03 09:53:59 +13003816 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003817
Dustin Gravesc900f572016-05-16 11:07:59 -06003818 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3819 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3820 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003821 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003822 pCommandBuffers, true, true);
3823
Chris Forbes04b61da2016-11-03 09:53:59 +13003824 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003825 device_data->dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003826 }
3827}
3828
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003829bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003830 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003831 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3832
3833 if (pInfo != NULL) {
Chris Forbesc5554a52016-11-24 14:45:16 +13003834 if ((dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003835 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003836 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 -06003837 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003838 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3839 "inheritedQueries.");
3840 }
3841
Chris Forbesc5554a52016-11-24 14:45:16 +13003842 if ((dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003843 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003844 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003845 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 -06003846 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003847 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3848 "valid combination of VkQueryControlFlagBits.",
3849 pInfo->queryFlags);
3850 }
3851 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003852 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003853}
3854
3855VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003856 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003857 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003858 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3859 assert(device_data != nullptr);
3860 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003861
Chris Forbes04b61da2016-11-03 09:53:59 +13003862 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003863
Dustin Gravesc900f572016-05-16 11:07:59 -06003864 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3865 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003866 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003867 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3868 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3869
3870 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003871 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003872 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003873
Chris Forbes04b61da2016-11-03 09:53:59 +13003874 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003875 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3876
Dustin Gravesc900f572016-05-16 11:07:59 -06003877 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003878 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003879 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3880
3881 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003882 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003883 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3884 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3885 }
3886
Chris Forbes04b61da2016-11-03 09:53:59 +13003887 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003888
Chris Forbes04b61da2016-11-03 09:53:59 +13003889 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003890 result = device_data->dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003891
Dustin Gravesc900f572016-05-16 11:07:59 -06003892 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003893 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003894
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003895 return result;
3896}
3897
Chia-I Wu01ca2372016-05-13 14:37:49 +08003898VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003899 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3900 assert(my_data != NULL);
3901
Chris Forbese58c9fe2016-11-24 14:44:17 +13003902 VkResult result = my_data->dispatch_table.EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003903
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003904 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003905
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003906 return result;
3907}
3908
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003909VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003910 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003911 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3912 assert(my_data != NULL);
3913
Chris Forbes04b61da2016-11-03 09:53:59 +13003914 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003915
Chris Forbes04b61da2016-11-03 09:53:59 +13003916 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003917 result = my_data->dispatch_table.ResetCommandBuffer(commandBuffer, flags);
Dustin Graves16d18972016-05-09 17:36:57 -06003918
3919 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3920 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003921
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003922 return result;
3923}
3924
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003925VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3926 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003927 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003928 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3929 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003930
Chris Forbes04b61da2016-11-03 09:53:59 +13003931 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003932
Chris Forbes04b61da2016-11-03 09:53:59 +13003933 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003934 my_data->dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003935 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003936}
3937
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003938bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3939 debug_report_data *report_data = my_data->report_data;
3940
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003941 bool skip =
3942 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003943
3944 if (viewport_count > 0 && viewports != nullptr) {
3945 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3946 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3947 const VkViewport &viewport = viewports[viewportIndex];
3948
3949 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3950 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3951 VALIDATION_ERROR_01448, LayerName,
3952 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3953 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3954 }
3955
3956 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3957 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3958 // VALIDATION_ERROR_01790
3959 invalid_height = false;
3960 }
3961 if (invalid_height) {
3962 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3963 VALIDATION_ERROR_01449, LayerName,
3964 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3965 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3966 }
3967
3968 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3969 skip |=
3970 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3971 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3972 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3973 validation_error_map[VALIDATION_ERROR_01450]);
3974 }
3975
3976 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
3977 skip |=
3978 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3979 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
3980 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3981 validation_error_map[VALIDATION_ERROR_01450]);
3982 }
3983
3984 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
3985 skip |=
3986 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3987 VALIDATION_ERROR_01451, LayerName,
3988 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
3989 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
3990 }
3991
3992 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
3993 skip |=
3994 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3995 VALIDATION_ERROR_01452, LayerName,
3996 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
3997 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
3998 }
3999 }
4000 }
4001
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004002 return skip;
4003}
4004
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004005VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4006 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004007 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004008 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004009 assert(my_data != NULL);
4010
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004011 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004012
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004013 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004014 my_data->dispatch_table.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004015 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004016}
4017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004018VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4019 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004020 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004022 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004023 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004024
Chris Forbes04b61da2016-11-03 09:53:59 +13004025 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004026
Mike Weiblena4742dc2016-10-31 11:05:56 -06004027 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4028 const VkRect2D &pScissor = pScissors[scissorIndex];
4029
4030 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004031 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004032 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4033 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4034 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004035 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004036 VALIDATION_ERROR_01490, LayerName,
4037 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4038 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4039 }
4040
4041 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004042 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004043 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4044 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4045 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004046 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004047 VALIDATION_ERROR_01491, LayerName,
4048 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4049 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4050 }
4051 }
4052
Chris Forbes04b61da2016-11-03 09:53:59 +13004053 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004054 my_data->dispatch_table.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004055 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004056}
4057
Chia-I Wu01ca2372016-05-13 14:37:49 +08004058VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004059 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4060 my_data->dispatch_table.CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004061}
4062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004063VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4064 float depthBiasSlopeFactor) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4066 my_data->dispatch_table.CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004067}
4068
Chia-I Wu01ca2372016-05-13 14:37:49 +08004069VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004070 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004071 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004072 assert(my_data != NULL);
4073
Chris Forbes04b61da2016-11-03 09:53:59 +13004074 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004075
Chris Forbes04b61da2016-11-03 09:53:59 +13004076 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004077 my_data->dispatch_table.CmdSetBlendConstants(commandBuffer, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004078 }
Cody Northrop12365112015-08-17 11:10:49 -06004079}
4080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004081VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004082 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4083 my_data->dispatch_table.CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004084}
4085
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004086VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4087 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004088 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004089 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4090 assert(my_data != NULL);
4091
Chris Forbes04b61da2016-11-03 09:53:59 +13004092 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004093
Chris Forbes04b61da2016-11-03 09:53:59 +13004094 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004095 my_data->dispatch_table.CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004096 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004097}
4098
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004099VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4102 assert(my_data != NULL);
4103
Chris Forbes04b61da2016-11-03 09:53:59 +13004104 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004105
Chris Forbes04b61da2016-11-03 09:53:59 +13004106 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004107 my_data->dispatch_table.CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004108 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004109}
4110
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004111VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004112 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004113 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4114 assert(my_data != NULL);
4115
Chris Forbes04b61da2016-11-03 09:53:59 +13004116 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004117
Chris Forbes04b61da2016-11-03 09:53:59 +13004118 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004119 my_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004120 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004121}
4122
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004123VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4124 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4125 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4126 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004127 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004128 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004129 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004130
Chris Forbes04b61da2016-11-03 09:53:59 +13004131 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004132 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4133 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004134
Chris Forbes04b61da2016-11-03 09:53:59 +13004135 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004136 my_data->dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004137 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004138 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004139}
4140
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004141VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4142 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004143 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4145 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004146
Chris Forbes04b61da2016-11-03 09:53:59 +13004147 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004148
Chris Forbes04b61da2016-11-03 09:53:59 +13004149 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004150 my_data->dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004151 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004152}
4153
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004154VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4155 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004156 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004158 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004159
Chris Forbes04b61da2016-11-03 09:53:59 +13004160 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004161
Chris Forbes04b61da2016-11-03 09:53:59 +13004162 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004163 my_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004164 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004165}
4166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004167bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4168 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004169 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004170 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004171 // 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 -07004172 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004173 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 -06004174 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004175 return false;
4176 }
4177
4178 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004179 // 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 -07004180 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004181 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 -06004182 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004183 return false;
4184 }
4185
4186 return true;
4187}
4188
Chia-I Wu01ca2372016-05-13 14:37:49 +08004189VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4190 uint32_t firstVertex, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004191 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004192 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004193
Chris Forbese58c9fe2016-11-24 14:44:17 +13004194 my_data->dispatch_table.CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004195}
4196
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004197VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4198 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004199 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4200 my_data->dispatch_table.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004201}
4202
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004203VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4204 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004205 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004206 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4207 assert(my_data != NULL);
4208
Chris Forbes04b61da2016-11-03 09:53:59 +13004209 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004210
Chris Forbes04b61da2016-11-03 09:53:59 +13004211 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004212 my_data->dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004213 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004214}
4215
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004216VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4217 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004218 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004219 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4220 assert(my_data != NULL);
4221
Chris Forbes04b61da2016-11-03 09:53:59 +13004222 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004223
Chris Forbes04b61da2016-11-03 09:53:59 +13004224 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004225 my_data->dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004226 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004227}
4228
Chia-I Wu01ca2372016-05-13 14:37:49 +08004229VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4231 my_data->dispatch_table.CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004232}
4233
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004234VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004235 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4237 assert(my_data != NULL);
4238
Chris Forbes04b61da2016-11-03 09:53:59 +13004239 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004240
Chris Forbes04b61da2016-11-03 09:53:59 +13004241 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004242 my_data->dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004243 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004244}
4245
Chia-I Wu01ca2372016-05-13 14:37:49 +08004246VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4247 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004248 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004250 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004251
Chris Forbes04b61da2016-11-03 09:53:59 +13004252 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004253
Chris Forbes04b61da2016-11-03 09:53:59 +13004254 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004255 my_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004256 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004257}
4258
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004259bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261 if (pRegions != nullptr) {
4262 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4263 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004264 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 -06004265 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004266 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4267 return false;
4268 }
4269 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4270 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004271 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 -06004272 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004273 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4274 return false;
4275 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004276 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004277
4278 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004279}
4280
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004281VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4282 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4283 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004284 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004285 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004286 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004287
Chris Forbes04b61da2016-11-03 09:53:59 +13004288 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004289 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004290
Chris Forbes04b61da2016-11-03 09:53:59 +13004291 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004292 PreCmdCopyImage(commandBuffer, pRegions);
4293
Chris Forbese58c9fe2016-11-24 14:44:17 +13004294 my_data->dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004295 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004296}
4297
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004298bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004299 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004300 if (pRegions != nullptr) {
4301 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4302 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004303 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 -06004304 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004305 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4306 return false;
4307 }
4308 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4309 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004310 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 -06004311 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004312 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4313 return false;
4314 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004315 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004316
4317 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004318}
4319
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004320VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4321 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4322 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004323 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004325 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004326
Chris Forbes04b61da2016-11-03 09:53:59 +13004327 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004328 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004329
Chris Forbes04b61da2016-11-03 09:53:59 +13004330 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004331 PreCmdBlitImage(commandBuffer, pRegions);
4332
Chris Forbese58c9fe2016-11-24 14:44:17 +13004333 my_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004334 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004335}
4336
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004337bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004338 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004339 if (pRegions != nullptr) {
4340 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4341 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004342 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 -06004343 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004344 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4345 "enumerator");
4346 return false;
4347 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004348 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004349
4350 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004351}
4352
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004353VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4354 VkImageLayout dstImageLayout, uint32_t regionCount,
4355 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004356 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004357 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004358 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004359
Chris Forbes04b61da2016-11-03 09:53:59 +13004360 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004361 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004362
Chris Forbes04b61da2016-11-03 09:53:59 +13004363 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004364 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4365
Chris Forbese58c9fe2016-11-24 14:44:17 +13004366 my_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004367 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004368}
4369
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004370bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004371 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004372 if (pRegions != nullptr) {
4373 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4374 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004375 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 -06004376 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004377 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4378 "enumerator");
4379 return false;
4380 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004381 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004382
4383 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004384}
4385
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004386VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4387 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004388 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004389 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004390 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004391
Chris Forbes04b61da2016-11-03 09:53:59 +13004392 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004393 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004394
Chris Forbes04b61da2016-11-03 09:53:59 +13004395 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004396 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4397
Chris Forbese58c9fe2016-11-24 14:44:17 +13004398 my_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004399 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004400}
4401
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004402VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4403 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004404 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004405 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004406 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004407
Chris Forbes04b61da2016-11-03 09:53:59 +13004408 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004409
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004410 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004411 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004412 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4413 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004414 }
4415
4416 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004417 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004418 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4419 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004420 dataSize);
4421 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004422 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004423 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4424 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004425 }
4426
Chris Forbes04b61da2016-11-03 09:53:59 +13004427 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004428 my_data->dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004429 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004430}
4431
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004432VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4433 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004434 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004435 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4436 assert(my_data != NULL);
4437
Chris Forbes04b61da2016-11-03 09:53:59 +13004438 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004439
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004440 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004441 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004442 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4443 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004444 }
4445
4446 if (size != VK_WHOLE_SIZE) {
4447 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004448 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004449 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004450 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004451 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004452 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004453 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004454 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4455 }
4456 }
4457
Chris Forbes04b61da2016-11-03 09:53:59 +13004458 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004459 my_data->dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004460 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004461}
4462
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004463VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4464 const VkClearColorValue *pColor, uint32_t rangeCount,
4465 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004466 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004468 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004469
Chris Forbes04b61da2016-11-03 09:53:59 +13004470 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004471
Chris Forbes04b61da2016-11-03 09:53:59 +13004472 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004473 my_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004474 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004475}
4476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004477VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4478 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4479 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004480 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004481 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004482 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004483
Chris Forbes04b61da2016-11-03 09:53:59 +13004484 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004485 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004486
Chris Forbes04b61da2016-11-03 09:53:59 +13004487 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004488 my_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004490}
4491
Chia-I Wu01ca2372016-05-13 14:37:49 +08004492VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4493 const VkClearAttachment *pAttachments, uint32_t rectCount,
4494 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004495 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004496 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004497 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004498
Chris Forbes04b61da2016-11-03 09:53:59 +13004499 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004500
Chris Forbes04b61da2016-11-03 09:53:59 +13004501 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004502 my_data->dispatch_table.CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004503 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004504}
4505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004506bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004507 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004508 if (pRegions != nullptr) {
4509 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4510 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4511 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004512 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 -06004513 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004514 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4515 return false;
4516 }
4517 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4518 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4519 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004520 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 -06004521 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004522 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4523 return false;
4524 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004525 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004526
4527 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004528}
4529
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004530VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4531 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4532 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004533 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004534 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004535 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004536
Chris Forbes04b61da2016-11-03 09:53:59 +13004537 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004538 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004539
Chris Forbes04b61da2016-11-03 09:53:59 +13004540 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004541 PreCmdResolveImage(commandBuffer, pRegions);
4542
Chris Forbese58c9fe2016-11-24 14:44:17 +13004543 my_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004544 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004545}
4546
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004547VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004548 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004549 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4550 assert(my_data != NULL);
4551
Chris Forbes04b61da2016-11-03 09:53:59 +13004552 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004553
Chris Forbes04b61da2016-11-03 09:53:59 +13004554 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004555 my_data->dispatch_table.CmdSetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004556 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004557}
4558
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004559VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004560 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004561 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4562 assert(my_data != NULL);
4563
Chris Forbes04b61da2016-11-03 09:53:59 +13004564 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004565
Chris Forbes04b61da2016-11-03 09:53:59 +13004566 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004567 my_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004568 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004569}
4570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004571VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4572 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4573 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4574 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4575 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004576 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004577 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004578 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004579
Chris Forbes04b61da2016-11-03 09:53:59 +13004580 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004581 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4582 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004583
Chris Forbes04b61da2016-11-03 09:53:59 +13004584 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004585 my_data->dispatch_table.CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004586 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004587 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004588}
4589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004590VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4591 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4592 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4593 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4594 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004595 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004596 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004597 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004598
Chris Forbes04b61da2016-11-03 09:53:59 +13004599 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004600 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4601 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004602
Chris Forbes04b61da2016-11-03 09:53:59 +13004603 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004604 my_data->dispatch_table.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004605 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004606 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004607}
4608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004609VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4610 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004611 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004612 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4613 assert(my_data != NULL);
4614
Chris Forbes04b61da2016-11-03 09:53:59 +13004615 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004616
Chris Forbes04b61da2016-11-03 09:53:59 +13004617 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004618 my_data->dispatch_table.CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004619 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004620}
4621
Chia-I Wu01ca2372016-05-13 14:37:49 +08004622VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004623 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004624 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4625 assert(my_data != NULL);
4626
Chris Forbes04b61da2016-11-03 09:53:59 +13004627 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004628
Chris Forbes04b61da2016-11-03 09:53:59 +13004629 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004630 my_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004631 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004632}
4633
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004634VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4635 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004636 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004637 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4638 assert(my_data != NULL);
4639
Chris Forbes04b61da2016-11-03 09:53:59 +13004640 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004641
Chris Forbes04b61da2016-11-03 09:53:59 +13004642 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004643 my_data->dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004644 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004645}
4646
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004647bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4648 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004649
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004650 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004651
4652 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004653}
4654
Chia-I Wu01ca2372016-05-13 14:37:49 +08004655VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4656 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004657 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4659 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004660
Chris Forbes04b61da2016-11-03 09:53:59 +13004661 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004662
Chris Forbes04b61da2016-11-03 09:53:59 +13004663 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004664 my_data->dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004665
4666 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4667 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004668}
4669
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004670VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4671 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4672 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004673 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004674 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4675 assert(my_data != NULL);
4676
Chris Forbes04b61da2016-11-03 09:53:59 +13004677 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004678 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004679
Chris Forbes04b61da2016-11-03 09:53:59 +13004680 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004681 my_data->dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004682 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004683}
4684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004685VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4686 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004687 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004689 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004690
Chris Forbes04b61da2016-11-03 09:53:59 +13004691 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004692
Chris Forbes04b61da2016-11-03 09:53:59 +13004693 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004694 my_data->dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004695 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004696}
4697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004698VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4699 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004700 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004701 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004702 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004703
Chris Forbes04b61da2016-11-03 09:53:59 +13004704 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004705
Chris Forbes04b61da2016-11-03 09:53:59 +13004706 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004707 my_data->dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004708 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004709}
4710
Chia-I Wu01ca2372016-05-13 14:37:49 +08004711VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004712 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004713 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4714 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004715
Chris Forbes04b61da2016-11-03 09:53:59 +13004716 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004717
Chris Forbes04b61da2016-11-03 09:53:59 +13004718 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004719 my_data->dispatch_table.CmdNextSubpass(commandBuffer, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004720 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004721}
4722
Chia-I Wu01ca2372016-05-13 14:37:49 +08004723VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4725 my_data->dispatch_table.CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004726}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004727
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004728VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4729 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004730 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004731 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004732 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004733
Chris Forbes04b61da2016-11-03 09:53:59 +13004734 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004735
Chris Forbes04b61da2016-11-03 09:53:59 +13004736 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004737 my_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004738 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004739}
4740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004741VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004742 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4743}
4744
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004745VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4746 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004747 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4748}
4749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004750VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4751 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004752 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4753 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4754
4755 return VK_ERROR_LAYER_NOT_PRESENT;
4756}
4757
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004758VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4759 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004760 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004761 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004762 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004763
4764 assert(physicalDevice);
4765
Chris Forbes6444bba2016-11-24 14:15:23 +13004766 return get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map)
4767 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004768}
4769
Chris Forbes448ebcb2016-11-03 09:29:52 +13004770bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4771{
4772 if (!(my_data->*flag)) {
4773 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4774 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4775 "%s() called even though the %s extension was not enabled for this VkDevice.",
4776 function_name, extension_name);
4777 }
4778
4779 return false;
4780}
4781
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004782// WSI Extension Functions
4783
4784VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004785 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004786 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004787 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004788 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4789 assert(my_data != NULL);
4790
Chris Forbes04b61da2016-11-03 09:53:59 +13004791 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004792
Chris Forbes04b61da2016-11-03 09:53:59 +13004793 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004794
Chris Forbes04b61da2016-11-03 09:53:59 +13004795 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004796 result = my_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004797
4798 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4799 }
4800
4801 return result;
4802}
4803
4804VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004805 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004806 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004807 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004808 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4809 assert(my_data != NULL);
4810
Chris Forbes04b61da2016-11-03 09:53:59 +13004811 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004812
Chris Forbes04b61da2016-11-03 09:53:59 +13004813 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004814 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4815
Chris Forbes04b61da2016-11-03 09:53:59 +13004816 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004817 result = my_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004818
4819 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4820 }
4821
4822 return result;
4823}
4824
4825VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004826 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004827 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004828 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004829 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4830 assert(my_data != NULL);
4831
Chris Forbes04b61da2016-11-03 09:53:59 +13004832 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004833
Chris Forbes04b61da2016-11-03 09:53:59 +13004834 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004835 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4836
Chris Forbes04b61da2016-11-03 09:53:59 +13004837 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004838 result = my_data->dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004839
4840 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4841 }
4842
4843 return result;
4844}
4845
4846VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4847 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004848 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004849 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4850 assert(my_data != NULL);
4851
Chris Forbes04b61da2016-11-03 09:53:59 +13004852 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004853
Chris Forbes04b61da2016-11-03 09:53:59 +13004854 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004855
Chris Forbes04b61da2016-11-03 09:53:59 +13004856 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004857 result = my_data->dispatch_table.QueuePresentKHR(queue, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004858
4859 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4860 }
4861
4862 return result;
4863}
4864
Chris Forbesbe5f5202016-11-02 18:34:25 +13004865VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004866 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004867 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4868 assert(my_data != NULL);
4869
Chris Forbes04b61da2016-11-03 09:53:59 +13004870 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004871
4872 /* No generated validation function for this call */
4873
Chris Forbes04b61da2016-11-03 09:53:59 +13004874 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004875 my_data->dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004876 }
4877}
4878
Chris Forbes115f98c2016-11-03 09:51:48 +13004879bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4880{
Chris Forbes6be763e2016-11-24 12:42:33 +13004881 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
4882 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13004883 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4884 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4885 "%s() called even though the %s extension was not enabled for this VkInstance.",
4886 function_name, extension_name);
4887 }
4888
4889 return false;
4890}
4891
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004892VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4893 VkSurfaceKHR surface, VkBool32 *pSupported) {
4894 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004895 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004896 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004897 assert(my_data != NULL);
4898
Chris Forbes04b61da2016-11-03 09:53:59 +13004899 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004900 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004901
Chris Forbes04b61da2016-11-03 09:53:59 +13004902 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004903 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4904
Chris Forbes04b61da2016-11-03 09:53:59 +13004905 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004906 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004907
4908 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4909 }
4910
4911 return result;
4912}
4913
4914VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4915 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4916 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004917 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004918 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004919 assert(my_data != NULL);
4920
Chris Forbes04b61da2016-11-03 09:53:59 +13004921 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004922 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004923
Chris Forbes04b61da2016-11-03 09:53:59 +13004924 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004925 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004926
Chris Forbes04b61da2016-11-03 09:53:59 +13004927 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004928 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004929
4930 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4931 }
4932
4933 return result;
4934}
4935
4936VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4937 uint32_t *pSurfaceFormatCount,
4938 VkSurfaceFormatKHR *pSurfaceFormats) {
4939 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004940 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004941 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 assert(my_data != NULL);
4943
Chris Forbes04b61da2016-11-03 09:53:59 +13004944 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004945 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004946
Chris Forbes04b61da2016-11-03 09:53:59 +13004947 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004948 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949
Chris Forbes04b61da2016-11-03 09:53:59 +13004950 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004951 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
4952 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953
4954 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4955 }
4956
4957 return result;
4958}
4959
4960VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4961 uint32_t *pPresentModeCount,
4962 VkPresentModeKHR *pPresentModes) {
4963 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004964 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004965 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004966 assert(my_data != NULL);
4967
Chris Forbes04b61da2016-11-03 09:53:59 +13004968 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004969 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004970
Chris Forbes04b61da2016-11-03 09:53:59 +13004971 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004972 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973
Chris Forbes04b61da2016-11-03 09:53:59 +13004974 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004975 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
4976 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004977
4978 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4979 }
4980
4981 return result;
4982}
4983
Chris Forbesbe5f5202016-11-02 18:34:25 +13004984VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004985 bool skip = false;
Chris Forbes6444bba2016-11-24 14:15:23 +13004986 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004987
Chris Forbes04b61da2016-11-03 09:53:59 +13004988 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004989 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004990
Chris Forbes04b61da2016-11-03 09:53:59 +13004991 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004992 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004993 }
4994}
4995
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004996#ifdef VK_USE_PLATFORM_WIN32_KHR
4997VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4998 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4999 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5000
Chris Forbes7b58a712016-11-24 11:35:31 +13005001 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005002 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005003 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005004
Chris Forbes04b61da2016-11-03 09:53:59 +13005005 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005006 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005007
Chris Forbes04b61da2016-11-03 09:53:59 +13005008 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005009
Chris Forbes04b61da2016-11-03 09:53:59 +13005010 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005011 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005012 }
5013
5014 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5015
5016 return result;
5017}
Chris Forbes9a083b92016-11-02 16:58:15 +13005018
5019VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5020 uint32_t queueFamilyIndex)
5021{
5022 VkBool32 result = false;
5023
Chris Forbes7b58a712016-11-24 11:35:31 +13005024 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005025 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005026 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005027
Chris Forbes04b61da2016-11-03 09:53:59 +13005028 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005029 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005030
Chris Forbes7281a502016-11-08 08:45:03 +13005031 // TODO: codegen doesn't produce this function?
5032 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005033
Chris Forbes04b61da2016-11-03 09:53:59 +13005034 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005035 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005036 }
5037
5038 return result;
5039}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005040#endif // VK_USE_PLATFORM_WIN32_KHR
5041
5042#ifdef VK_USE_PLATFORM_XCB_KHR
5043VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5044 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5045 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5046
Chris Forbes7b58a712016-11-24 11:35:31 +13005047 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005049 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005050
Chris Forbes04b61da2016-11-03 09:53:59 +13005051 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005052 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005053
Chris Forbes04b61da2016-11-03 09:53:59 +13005054 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005055
Chris Forbes04b61da2016-11-03 09:53:59 +13005056 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005057 result = my_data->dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005058 }
5059
5060 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5061
5062 return result;
5063}
5064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005065VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5066 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5067 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005068 VkBool32 result = false;
5069
Chris Forbes7b58a712016-11-24 11:35:31 +13005070 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005071 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005072 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005073
Chris Forbes04b61da2016-11-03 09:53:59 +13005074 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005075 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005076
Chris Forbes04b61da2016-11-03 09:53:59 +13005077 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005078 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005079
Chris Forbes04b61da2016-11-03 09:53:59 +13005080 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005081 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5082 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005083 }
5084
5085 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005086}
5087#endif // VK_USE_PLATFORM_XCB_KHR
5088
5089#ifdef VK_USE_PLATFORM_XLIB_KHR
5090VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005091 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005092 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5093
Chris Forbes7b58a712016-11-24 11:35:31 +13005094 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005095 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005096 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005097
Chris Forbes04b61da2016-11-03 09:53:59 +13005098 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005099 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005100
Chris Forbes04b61da2016-11-03 09:53:59 +13005101 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005102
Chris Forbes04b61da2016-11-03 09:53:59 +13005103 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005104 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005105 }
5106
5107 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5108
5109 return result;
5110}
5111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005112VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5113 uint32_t queueFamilyIndex, Display *dpy,
5114 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005115 VkBool32 result = false;
5116
Chris Forbes7b58a712016-11-24 11:35:31 +13005117 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005118 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005119 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005120
Chris Forbes04b61da2016-11-03 09:53:59 +13005121 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005122 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005123
Chris Forbes04b61da2016-11-03 09:53:59 +13005124 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005125
Chris Forbes04b61da2016-11-03 09:53:59 +13005126 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005127 result =
5128 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005129 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005130 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005131}
5132#endif // VK_USE_PLATFORM_XLIB_KHR
5133
5134#ifdef VK_USE_PLATFORM_MIR_KHR
5135VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005136 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005137 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5138
Chris Forbes7b58a712016-11-24 11:35:31 +13005139 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005140 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005141 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005142
Chris Forbes04b61da2016-11-03 09:53:59 +13005143 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005144 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005145
Chris Forbes04b61da2016-11-03 09:53:59 +13005146 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005147
Chris Forbes04b61da2016-11-03 09:53:59 +13005148 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005149 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005150 }
5151
5152 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5153
5154 return result;
5155}
5156
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005157VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5158 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005159 VkBool32 result = false;
5160
Chris Forbes7b58a712016-11-24 11:35:31 +13005161 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005162 assert(my_data != NULL);
5163
Chris Forbes04b61da2016-11-03 09:53:59 +13005164 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005165
Chris Forbes04b61da2016-11-03 09:53:59 +13005166 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005167 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5168
Chris Forbes04b61da2016-11-03 09:53:59 +13005169 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005170
Chris Forbes04b61da2016-11-03 09:53:59 +13005171 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005172 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005173 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005174 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005175}
5176#endif // VK_USE_PLATFORM_MIR_KHR
5177
5178#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5179VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005180 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005181 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5182
Chris Forbes7b58a712016-11-24 11:35:31 +13005183 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005184 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005185 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005186
Chris Forbes04b61da2016-11-03 09:53:59 +13005187 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005188 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5189
Chris Forbes04b61da2016-11-03 09:53:59 +13005190 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005191
Chris Forbes04b61da2016-11-03 09:53:59 +13005192 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005193 result = my_data->dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005194 }
5195
5196 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5197
5198 return result;
5199}
5200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005201VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5202 uint32_t queueFamilyIndex,
5203 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005204 VkBool32 result = false;
5205
Chris Forbes7b58a712016-11-24 11:35:31 +13005206 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005207 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005208 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005209
Chris Forbes04b61da2016-11-03 09:53:59 +13005210 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005211 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5212
Chris Forbes04b61da2016-11-03 09:53:59 +13005213 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005214 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005215
Chris Forbes04b61da2016-11-03 09:53:59 +13005216 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005217 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005218 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005219
5220 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005221}
5222#endif // VK_USE_PLATFORM_WAYLAND_KHR
5223
5224#ifdef VK_USE_PLATFORM_ANDROID_KHR
5225VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005226 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005227 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5228
Chris Forbes7b58a712016-11-24 11:35:31 +13005229 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005230 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005231 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005232
Chris Forbes04b61da2016-11-03 09:53:59 +13005233 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005234 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005235
Chris Forbes04b61da2016-11-03 09:53:59 +13005236 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005237
Chris Forbes04b61da2016-11-03 09:53:59 +13005238 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005239 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005240 }
5241
5242 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5243
5244 return result;
5245}
5246#endif // VK_USE_PLATFORM_ANDROID_KHR
5247
Mark Youngead9b932016-09-08 12:28:38 -06005248VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5249 const VkSwapchainCreateInfoKHR *pCreateInfos,
5250 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5251 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005252 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005253 auto my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005254 assert(my_data != NULL);
5255
Chris Forbes04b61da2016-11-03 09:53:59 +13005256 skip |= require_device_extension(my_data, &layer_data::display_swapchain_enabled, "vkCreateSharedSwapchainsKHR", VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005257
Chris Forbes04b61da2016-11-03 09:53:59 +13005258 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005259 pSwapchains);
5260
Chris Forbes04b61da2016-11-03 09:53:59 +13005261 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005262 result = my_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005263
5264 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5265 }
5266
5267 return result;
5268}
5269
Chris Forbes667a5212016-11-03 10:18:35 +13005270VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5271 VkDisplayPropertiesKHR *pProperties) {
5272 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5273 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005274 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005275 assert(my_data != NULL);
5276
5277 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5278 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5279
5280 // No parameter validation function for this call?
5281
5282 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005283 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005284
5285 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5286 }
5287
5288 return result;
5289}
5290
5291VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5292 VkDisplayPlanePropertiesKHR *pProperties) {
5293 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5294 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005295 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005296 assert(my_data != NULL);
5297
5298 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5299 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5300
5301 // No parameter validation function for this call?
5302
5303 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005304 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005305
5306 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5307 }
5308
5309 return result;
5310}
5311
5312VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5313 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5314 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5315 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005316 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005317 assert(my_data != NULL);
5318
5319 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5320 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5321
5322 // No parameter validation function for this call?
5323
5324 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005325 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005326
5327 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5328 }
5329
5330 return result;
5331}
5332
5333VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5334 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5335 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5336 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005337 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005338 assert(my_data != NULL);
5339
5340 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5341 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5342
5343 // No parameter validation function for this call?
5344
5345 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005346 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005347
5348 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5349 }
5350
5351 return result;
5352}
5353
5354VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5355 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5356 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5357 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5358 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005359 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005360 assert(my_data != NULL);
5361
5362 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5363 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5364
5365 // No parameter validation function for this call?
5366
5367 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005368 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005369
5370 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5371 }
5372
5373 return result;
5374}
5375
5376VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5377 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5378 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5379 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005380 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005381 assert(my_data != NULL);
5382
5383 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5384 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5385
5386 // No parameter validation function for this call?
5387
5388 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005389 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005390
5391 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5392 }
5393
5394 return result;
5395}
5396
5397VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5398 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5399 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5400 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005401 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005402 assert(my_data != NULL);
5403
5404 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5405 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5406
5407 // No parameter validation function for this call?
5408
5409 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005410 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005411
5412 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5413 }
5414
5415 return result;
5416}
5417
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005418// VK_EXT_debug_marker Extension
5419VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5420 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005421 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005422 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5423 assert(my_data != NULL);
5424
Chris Forbes04b61da2016-11-03 09:53:59 +13005425 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005426
Chris Forbes04b61da2016-11-03 09:53:59 +13005427 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005428 if (my_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
5429 result = my_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
5430 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5431 } else {
5432 result = VK_SUCCESS;
5433 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005434 }
5435
5436 return result;
5437}
5438
5439VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5440 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005441 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005442 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5443 assert(my_data != NULL);
5444
Chris Forbes04b61da2016-11-03 09:53:59 +13005445 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005446
Chris Forbes04b61da2016-11-03 09:53:59 +13005447 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005448 if (my_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
5449 result = my_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
5450 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5451 } else {
5452 result = VK_SUCCESS;
5453 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005454 }
5455
5456 return result;
5457}
5458
5459VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005460 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005461 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5462 assert(my_data != NULL);
5463
Chris Forbes04b61da2016-11-03 09:53:59 +13005464 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005465
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005466 if (!skip && my_data->dispatch_table.CmdDebugMarkerBeginEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005467 my_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005468 }
5469}
5470
5471VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005472 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5474 assert(my_data != NULL);
5475
Chris Forbes04b61da2016-11-03 09:53:59 +13005476 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005477
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005478 if (!skip && my_data->dispatch_table.CmdDebugMarkerInsertEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005479 my_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005480 }
5481}
5482
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005483// VK_NV_external_memory_capabilities Extension
5484VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5485 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5486 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5487 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5488
5489 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005490 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005491 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005492 assert(my_data != NULL);
5493
Chris Forbes04b61da2016-11-03 09:53:59 +13005494 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005495 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5496
Chris Forbes04b61da2016-11-03 09:53:59 +13005497 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005498 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
5499 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005500
5501 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5502 }
5503
5504 return result;
5505}
5506
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005507#ifdef VK_USE_PLATFORM_WIN32_KHR
5508// VK_NV_external_memory_win32 Extension
5509VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5510 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5511
5512 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005513 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005514 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5515 assert(my_data != NULL);
5516
Chris Forbes04b61da2016-11-03 09:53:59 +13005517 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005518
Chris Forbes04b61da2016-11-03 09:53:59 +13005519 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005520 result = my_data->dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005521 }
5522
5523 return result;
5524}
5525#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005526
Mark Youngfa552782016-12-12 16:14:55 -07005527// VK_NVX_device_generated_commands extension
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005528
Mark Youngfa552782016-12-12 16:14:55 -07005529VKAPI_ATTR void VKAPI_CALL CmdProcessCommandsNVX(VkCommandBuffer commandBuffer,
5530 const VkCmdProcessCommandsInfoNVX *pProcessCommandsInfo) {
5531 bool skip = false;
5532 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5533 assert(device_data != nullptr);
5534 debug_report_data *report_data = device_data->report_data;
5535
5536 skip |= require_device_extension(device_data, &layer_data::nvx_device_generated_commands_enabled, "vkCmdProcessCommandsNVX",
5537 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5538 skip |= parameter_validation_vkCmdProcessCommandsNVX(report_data, pProcessCommandsInfo);
5539
5540 if (!skip) {
5541 device_data->dispatch_table.CmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo);
5542 }
5543}
5544
5545VKAPI_ATTR void VKAPI_CALL CmdReserveSpaceForCommandsNVX(VkCommandBuffer commandBuffer,
5546 const VkCmdReserveSpaceForCommandsInfoNVX *pReserveSpaceInfo) {
5547 bool skip = false;
5548 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5549 assert(device_data != nullptr);
5550 debug_report_data *report_data = device_data->report_data;
5551
5552 skip |= require_device_extension(device_data, &layer_data::nvx_device_generated_commands_enabled,
5553 "vkCmdReserveSpaceForCommandsNVX", VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5554 skip |= parameter_validation_vkCmdReserveSpaceForCommandsNVX(report_data, pReserveSpaceInfo);
5555
5556 if (!skip) {
5557 device_data->dispatch_table.CmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo);
5558 }
5559}
5560
5561VKAPI_ATTR VkResult VKAPI_CALL CreateIndirectCommandsLayoutNVX(VkDevice device,
5562 const VkIndirectCommandsLayoutCreateInfoNVX *pCreateInfo,
5563 const VkAllocationCallbacks *pAllocator,
5564 VkIndirectCommandsLayoutNVX *pIndirectCommandsLayout) {
5565 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5566 bool skip = false;
5567 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5568 assert(my_data != NULL);
5569 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled,
5570 "vkCreateIndirectCommandsLayoutNVX", VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5571 skip |= parameter_validation_vkCreateIndirectCommandsLayoutNVX(my_data->report_data, pCreateInfo, pAllocator,
5572 pIndirectCommandsLayout);
5573 if (!skip) {
5574 result = my_data->dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
5575
5576 validate_result(my_data->report_data, "vkCreateIndirectCommandsLayoutNVX", result);
5577 }
5578 return result;
5579}
5580
5581VKAPI_ATTR void VKAPI_CALL DestroyIndirectCommandsLayoutNVX(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout,
5582 const VkAllocationCallbacks *pAllocator) {
5583 bool skip = false;
5584 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5585 assert(my_data != NULL);
5586 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled,
5587 "vkDestroyIndirectCommandsLayoutNVX", VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5588 skip |= parameter_validation_vkDestroyIndirectCommandsLayoutNVX(my_data->report_data, indirectCommandsLayout, pAllocator);
5589 if (!skip) {
5590 my_data->dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
5591 }
5592}
5593
5594VKAPI_ATTR VkResult VKAPI_CALL CreateObjectTableNVX(VkDevice device, const VkObjectTableCreateInfoNVX *pCreateInfo,
5595 const VkAllocationCallbacks *pAllocator, VkObjectTableNVX *pObjectTable) {
5596 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5597 bool skip = false;
5598 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5599 assert(my_data != NULL);
5600 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkCreateObjectTableNVX",
5601 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5602 skip |= parameter_validation_vkCreateObjectTableNVX(my_data->report_data, pCreateInfo, pAllocator, pObjectTable);
5603 if (!skip) {
5604 result = my_data->dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
5605 }
5606 return result;
5607}
5608
5609VKAPI_ATTR void VKAPI_CALL DestroyObjectTableNVX(VkDevice device, VkObjectTableNVX objectTable,
5610 const VkAllocationCallbacks *pAllocator) {
5611 bool skip = false;
5612 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5613 assert(my_data != NULL);
5614 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkDestroyObjectTableNVX",
5615 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5616 skip |= parameter_validation_vkDestroyObjectTableNVX(my_data->report_data, objectTable, pAllocator);
5617 if (!skip) {
5618 my_data->dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator);
5619 }
5620}
5621
5622VKAPI_ATTR VkResult VKAPI_CALL RegisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
5623 const VkObjectTableEntryNVX *const *ppObjectTableEntries,
5624 const uint32_t *pObjectIndices) {
5625 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5626 bool skip = false;
5627 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5628 assert(my_data != NULL);
5629 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkRegisterObjectsNVX",
5630 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5631 skip |= parameter_validation_vkRegisterObjectsNVX(my_data->report_data, objectTable, objectCount, ppObjectTableEntries,
5632 pObjectIndices);
5633 if (!skip) {
5634 result = my_data->dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
5635 }
5636 return result;
5637}
5638
5639VKAPI_ATTR VkResult VKAPI_CALL UnregisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
5640 const VkObjectEntryTypeNVX *pObjectEntryTypes, const uint32_t *pObjectIndices) {
5641 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5642 bool skip = false;
5643 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5644 assert(my_data != NULL);
5645 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkUnregisterObjectsNVX",
5646 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5647 skip |= parameter_validation_vkUnregisterObjectsNVX(my_data->report_data, objectTable, objectCount, pObjectEntryTypes,
5648 pObjectIndices);
5649 if (!skip) {
5650 result = my_data->dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
5651 }
5652 return result;
5653}
5654
5655VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceGeneratedCommandsPropertiesNVX(VkPhysicalDevice physicalDevice,
5656 VkDeviceGeneratedCommandsFeaturesNVX *pFeatures,
5657 VkDeviceGeneratedCommandsLimitsNVX *pLimits) {
5658 bool skip = false;
5659 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
5660 assert(my_data != NULL);
5661
5662 skip |= parameter_validation_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(my_data->report_data, pFeatures, pLimits);
5663
5664 if (!skip) {
5665 my_data->dispatch_table.GetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
5666 }
5667}
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005669static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005671static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005673static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005674
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005675static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005676
Chia-I Wu01ca2372016-05-13 14:37:49 +08005677VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005678 assert(device);
5679
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005680 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5681
Dustin Graves080069b2016-04-05 13:48:15 -06005682 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005683 return NULL;
5684 }
5685
Chia-I Wuf9b01382016-05-16 07:37:41 +08005686 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5687 if (proc)
5688 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005689
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005690 proc = InterceptWsiEnabledCommand(funcName, device);
5691 if (proc)
5692 return proc;
5693
Chris Forbese58c9fe2016-11-24 14:44:17 +13005694 if (!data->dispatch_table.GetDeviceProcAddr)
5695 return nullptr;
5696 return data->dispatch_table.GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005697}
5698
Chia-I Wu01ca2372016-05-13 14:37:49 +08005699VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005700 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005701 if (!proc)
5702 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005703
5704 if (!proc)
5705 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005706
Chia-I Wu617f2a42016-05-16 07:41:17 +08005707 if (proc)
5708 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005709
Chia-I Wu617f2a42016-05-16 07:41:17 +08005710 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005711
Chris Forbes7b58a712016-11-24 11:35:31 +13005712 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005713
Chia-I Wu617f2a42016-05-16 07:41:17 +08005714 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005715 if (!proc)
5716 proc = InterceptWsiEnabledCommand(funcName, instance);
5717
Chia-I Wu617f2a42016-05-16 07:41:17 +08005718 if (proc)
5719 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005720
Chris Forbes6444bba2016-11-24 14:15:23 +13005721 if (!data->dispatch_table.GetInstanceProcAddr)
5722 return nullptr;
5723 return data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005724}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005726static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005727 static const struct {
5728 const char *name;
5729 PFN_vkVoidFunction proc;
5730 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005731 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5732 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5733 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5734 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5735 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5736 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5737 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5738 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5739 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5740 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5741 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5742 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5743 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5744 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5745 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5746 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5747 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Youngfa552782016-12-12 16:14:55 -07005748 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV",
5749 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV)},
5750 // NVX_device_generated_commands
5751 {"vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX",
5752 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceGeneratedCommandsPropertiesNVX)},
Chia-I Wu617f2a42016-05-16 07:41:17 +08005753 };
5754
5755 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5756 if (!strcmp(core_instance_commands[i].name, name))
5757 return core_instance_commands[i].proc;
5758 }
5759
5760 return nullptr;
5761}
5762
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005763static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005764 static const struct {
5765 const char *name;
5766 PFN_vkVoidFunction proc;
5767 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005768 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5769 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5770 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5771 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5772 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5773 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5774 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5775 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5776 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5777 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5778 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5779 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5780 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5781 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5782 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5783 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5784 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5785 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5786 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5787 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5788 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5789 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5790 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5791 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5792 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5793 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5794 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5795 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5796 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5797 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5798 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5799 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5800 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5801 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5802 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5803 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5804 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5805 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5806 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5807 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5808 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5809 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5810 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5811 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5812 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5813 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5814 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5815 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5816 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5817 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5818 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5819 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5820 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5821 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5822 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5823 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5824 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5825 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5826 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5827 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5828 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5829 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5830 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5831 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5832 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5833 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5834 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5835 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5836 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5837 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5838 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5839 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5840 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5841 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5842 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5843 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5844 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5845 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5846 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5847 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5848 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5849 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5850 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5851 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5852 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5853 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5854 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5855 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5856 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5857 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5858 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5859 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5860 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5861 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5862 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5863 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5864 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5865 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5866 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5867 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5868 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5869 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5870 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5871 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5872 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5873 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5874 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5875 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5876 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5877 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5878 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5879 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5880 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5881 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5882 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5883 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5884 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Youngfa552782016-12-12 16:14:55 -07005885 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT)},
5886 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT)},
5887 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT)},
5888 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT)},
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005889#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Youngfa552782016-12-12 16:14:55 -07005890 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV)},
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005891#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Youngfa552782016-12-12 16:14:55 -07005892 // NVX_device_generated_commands
5893 {"vkCmdProcessCommandsNVX", reinterpret_cast<PFN_vkVoidFunction>(CmdProcessCommandsNVX)},
5894 {"vkCmdReserveSpaceForCommandsNVX", reinterpret_cast<PFN_vkVoidFunction>(CmdReserveSpaceForCommandsNVX)},
5895 {"vkCreateIndirectCommandsLayoutNVX", reinterpret_cast<PFN_vkVoidFunction>(CreateIndirectCommandsLayoutNVX)},
5896 {"vkDestroyIndirectCommandsLayoutNVX", reinterpret_cast<PFN_vkVoidFunction>(DestroyIndirectCommandsLayoutNVX)},
5897 {"vkCreateObjectTableNVX", reinterpret_cast<PFN_vkVoidFunction>(CreateObjectTableNVX)},
5898 {"vkDestroyObjectTableNVX", reinterpret_cast<PFN_vkVoidFunction>(DestroyObjectTableNVX)},
5899 {"vkRegisterObjectsNVX", reinterpret_cast<PFN_vkVoidFunction>(RegisterObjectsNVX)},
5900 {"vkUnregisterObjectsNVX", reinterpret_cast<PFN_vkVoidFunction>(UnregisterObjectsNVX)},
5901 };
Chia-I Wuf9b01382016-05-16 07:37:41 +08005902
5903 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5904 if (!strcmp(core_device_commands[i].name, name))
5905 return core_device_commands[i].proc;
5906 }
5907
5908 return nullptr;
5909}
5910
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005911static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005912 static const struct {
5913 const char *name;
5914 PFN_vkVoidFunction proc;
5915 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005916 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5917 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5918 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5919 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005920 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005921 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005922 };
5923
5924 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005925 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5926 if (!strcmp(wsi_device_commands[i].name, name))
5927 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005928 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005929 }
5930
5931 return nullptr;
5932}
5933
5934static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5935 static const struct {
5936 const char *name;
5937 PFN_vkVoidFunction proc;
5938 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005939 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5940 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5941 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5942 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5943 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5944 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005945 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005946 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5947 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5948 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5949 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5950 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5951 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5952 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5953 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005954#ifdef VK_USE_PLATFORM_WIN32_KHR
5955 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5956 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5957#endif
5958#ifdef VK_USE_PLATFORM_XCB_KHR
5959 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5960 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5961#endif
5962#ifdef VK_USE_PLATFORM_XLIB_KHR
5963 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5964 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5965#endif
5966#ifdef VK_USE_PLATFORM_MIR_KHR
5967 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5968 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5969#endif
5970#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5971 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5972 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5973#endif
5974#ifdef VK_USE_PLATFORM_ANDROID_KHR
5975 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5976#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005977 };
5978
Chris Forbes8a13e272016-11-02 17:43:34 +13005979 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5980 if (!strcmp(wsi_instance_commands[i].name, name))
5981 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005982 }
5983
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005984 return nullptr;
5985}
5986
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005987} // namespace parameter_validation
5988
5989// vk_layer_logging.h expects these to be defined
5990
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005991VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5992 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5993 const VkAllocationCallbacks *pAllocator,
5994 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005995 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005996}
5997
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005998VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5999 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006000 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006001}
6002
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006003VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
6004 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
6005 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006006 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006007}
6008
6009// loader-layer interface v0
6010
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006011VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
6012 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006013 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08006014}
6015
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006016VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
6017 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006018 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08006019}
6020
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006021VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
6022 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006023 // the layer command handles VK_NULL_HANDLE just fine internally
6024 assert(physicalDevice == VK_NULL_HANDLE);
6025 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006026}
6027
6028VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
6029 const char *pLayerName, uint32_t *pCount,
6030 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006031 // the layer command handles VK_NULL_HANDLE just fine internally
6032 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08006033 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006034}
6035
6036VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006037 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006038}
6039
6040VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006041 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08006042}