blob: ceb10d1e88bd7e3ced8bd410764c981241edc0e3 [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
Mike Weiblena4742dc2016-10-31 11:05:56 -060026#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060027#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060028#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32#include <iostream>
33#include <string>
34#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050035#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060036#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060037#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060038
Chris Forbes6444bba2016-11-24 14:15:23 +130039#include "vk_dispatch_table_helper.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060040#include "vk_enum_validate_helper.h"
Chris Forbes6444bba2016-11-24 14:15:23 +130041#include "vk_layer_config.h"
42#include "vk_loader_platform.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060043#include "vk_struct_validate_helper.h"
Chris Forbes6444bba2016-11-24 14:15:23 +130044#include "vulkan/vk_layer.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060045
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060046#include "vk_layer_table.h"
47#include "vk_layer_data.h"
48#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060049#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070050#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060051
Dustin Graves8ffbbf62016-07-22 13:19:46 -060052#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060053#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070054
Chia-I Wu1a6b1932016-05-13 14:07:36 +080055namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060056
Chris Forbes7b58a712016-11-24 11:35:31 +130057struct instance_layer_data {
Chris Forbes7b57a392016-11-02 17:56:50 +130058 VkInstance instance = VK_NULL_HANDLE;
Chia-I Wua570b7c2016-05-16 07:48:14 +080059
Chris Forbes7b57a392016-11-02 17:56:50 +130060 debug_report_data *report_data = nullptr;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070061 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060062
Ian Elliotted6b5ac2016-04-28 09:08:13 -060063 // The following are for keeping track of the temporary callbacks that can
64 // be used in vkCreateInstance and vkDestroyInstance:
Chris Forbes7b57a392016-11-02 17:56:50 +130065 uint32_t num_tmp_callbacks = 0;
66 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos = nullptr;
67 VkDebugReportCallbackEXT *tmp_callbacks = nullptr;
Chris Forbes6be763e2016-11-24 12:42:33 +130068 instance_extension_enables extensions = {};
Chris Forbes6444bba2016-11-24 14:15:23 +130069
70 VkLayerInstanceDispatchTable dispatch_table = {};
Chris Forbes7b58a712016-11-24 11:35:31 +130071};
Ian Elliotted6b5ac2016-04-28 09:08:13 -060072
Chris Forbes7b58a712016-11-24 11:35:31 +130073struct layer_data {
74 instance_layer_data *instance_data = nullptr;
75
Jon Ashburn5484e0c2016-03-08 17:48:44 -070076 // Device Data
Chris Forbes7b58a712016-11-24 11:35:31 +130077 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070078 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060079 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130080 VkPhysicalDeviceLimits device_limits = {};
81 VkPhysicalDeviceFeatures physical_device_features = {};
82 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Michael Lentinebdf744f2016-01-27 15:43:43 -060083
Chris Forbes7b57a392016-11-02 17:56:50 +130084 bool swapchain_enabled = false;
85 bool display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -060086 bool amd_negative_viewport_height_enabled = false;
Cody Northrop55443ef2015-09-28 15:09:32 -060087};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050088
Jon Ashburn5484e0c2016-03-08 17:48:44 -070089static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +130090static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060091static device_table_map pc_device_table_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 Lobodzinskiaf00fa82016-08-09 10:44:38 -06001617 }
1618}
1619
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001620void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001621 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001622
1623 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1624 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1625 my_device_data->queueFamilyIndexMap.insert(
1626 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1627 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001628 }
1629}
1630
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001631VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001632 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001633 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001634 * NOTE: We do not validate physicalDevice or any dispatchable
1635 * object as the first parameter. We couldn't get here if it was wrong!
1636 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001637
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001638 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001639 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001640 auto my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001641 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001642
Chris Forbes04b61da2016-11-03 09:53:59 +13001643 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001644
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001645 if (pCreateInfo != NULL) {
1646 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001647 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001648 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001649 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001650 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001651 }
Michael Lentine774704f2016-01-27 13:36:46 -06001652
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001653 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001654 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001655 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001656 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001657 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001658 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001659 }
1660
Chris Forbes04b61da2016-11-03 09:53:59 +13001661 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001662 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001663 assert(chain_info != nullptr);
1664 assert(chain_info->u.pLayerInfo != nullptr);
1665
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001666 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1667 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001668 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001669 if (fpCreateDevice == NULL) {
1670 return VK_ERROR_INITIALIZATION_FAILED;
1671 }
1672
1673 // Advance the link info for the next element on the chain
1674 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1675
1676 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001677
1678 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1679
1680 if (result == VK_SUCCESS) {
1681 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1682 assert(my_device_data != nullptr);
1683
1684 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1685 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1686
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001687 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1688
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001689 uint32_t count;
Chris Forbes6444bba2016-11-24 14:15:23 +13001690 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001691 std::vector<VkQueueFamilyProperties> properties(count);
Chris Forbes6444bba2016-11-24 14:15:23 +13001692 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001693
1694 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1695 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001696
1697 // Query and save physical device limits for this device
1698 VkPhysicalDeviceProperties device_properties = {};
Chris Forbes6444bba2016-11-24 14:15:23 +13001699 my_instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &device_properties);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001700 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001701 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001702
1703 // Save app-enabled features in this device's layer_data structure
1704 if (pCreateInfo->pEnabledFeatures) {
1705 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1706 } else {
1707 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1708 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001709 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001710 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001711
Jeremy Hayes99a96322015-06-26 12:48:09 -06001712 return result;
1713}
1714
Chia-I Wu01ca2372016-05-13 14:37:49 +08001715VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001716 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001717 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001718 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1719 assert(my_data != NULL);
1720
Chris Forbes04b61da2016-11-03 09:53:59 +13001721 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001722
Chris Forbes04b61da2016-11-03 09:53:59 +13001723 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001724 layer_debug_report_destroy_device(device);
1725
Jeremy Hayes99a96322015-06-26 12:48:09 -06001726#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001727 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001728#endif
1729
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001730 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001731 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001732 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001733 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001734}
1735
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001736bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001737 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001738 assert(my_device_data != nullptr);
1739
Dustin Gravesde628532016-04-21 16:30:17 -06001740 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001741
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001742 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001743 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001744 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 -06001745 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001746 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1747 "was created.",
1748 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001749 return false;
1750 }
1751 return true;
1752}
1753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001754VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001755 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001756 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001757 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001758
Chris Forbes04b61da2016-11-03 09:53:59 +13001759 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001760
Chris Forbes04b61da2016-11-03 09:53:59 +13001761 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001762 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1763
1764 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001765 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001766}
1767
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001768VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001770 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001772 assert(my_data != NULL);
1773
Chris Forbes04b61da2016-11-03 09:53:59 +13001774 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001775
Chris Forbes04b61da2016-11-03 09:53:59 +13001776 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001777 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1778
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001779 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001780 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001781
Jeremy Hayes99a96322015-06-26 12:48:09 -06001782 return result;
1783}
1784
Chia-I Wu01ca2372016-05-13 14:37:49 +08001785VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1787 assert(my_data != NULL);
1788
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001789 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001791 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001792
1793 return result;
1794}
1795
Chia-I Wu01ca2372016-05-13 14:37:49 +08001796VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1798 assert(my_data != NULL);
1799
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001800 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001801
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001802 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001803
1804 return result;
1805}
1806
Chia-I Wu01ca2372016-05-13 14:37:49 +08001807VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001808 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001809 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001810 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001812 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001813
Chris Forbes04b61da2016-11-03 09:53:59 +13001814 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001815
Chris Forbes04b61da2016-11-03 09:53:59 +13001816 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001817 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1818
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001819 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001820 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
1822 return result;
1823}
1824
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001825VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001826 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001828 assert(my_data != NULL);
1829
Chris Forbes04b61da2016-11-03 09:53:59 +13001830 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001831
Chris Forbes04b61da2016-11-03 09:53:59 +13001832 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001833 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001834 }
1835}
1836
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001837VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1838 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001840 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001843
Chris Forbes04b61da2016-11-03 09:53:59 +13001844 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001845
Chris Forbes04b61da2016-11-03 09:53:59 +13001846 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1848
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001849 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001851
1852 return result;
1853}
1854
Chia-I Wu01ca2372016-05-13 14:37:49 +08001855VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001856 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001857 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1858 assert(my_data != NULL);
1859
Chris Forbes04b61da2016-11-03 09:53:59 +13001860 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001861
Chris Forbes04b61da2016-11-03 09:53:59 +13001862 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001863 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1864 }
1865}
1866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001867VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1868 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001870 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001873
Chris Forbes04b61da2016-11-03 09:53:59 +13001874 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001875
Chris Forbes04b61da2016-11-03 09:53:59 +13001876 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1878
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001879 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001881
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001882 return result;
1883}
1884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001885VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1886 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001887 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001888 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001890 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001891
Chris Forbes04b61da2016-11-03 09:53:59 +13001892 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001893
Chris Forbes04b61da2016-11-03 09:53:59 +13001894 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001895 result =
1896 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001897
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001898 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001900
Tony Barbourb1250542015-04-16 19:23:13 -06001901 return result;
1902}
1903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001904VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1905 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001906 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001908 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001909
Chris Forbes04b61da2016-11-03 09:53:59 +13001910 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911
Chris Forbes04b61da2016-11-03 09:53:59 +13001912 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001913 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001915}
1916
Chia-I Wu01ca2372016-05-13 14:37:49 +08001917VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1918 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001919 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001920 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1922 assert(my_data != NULL);
1923
Chris Forbes04b61da2016-11-03 09:53:59 +13001924 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001925
Chris Forbes04b61da2016-11-03 09:53:59 +13001926 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001927 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1928
1929 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1930 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001931
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001932 return result;
1933}
1934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001935VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001936 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001937 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001938 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1939 assert(my_data != NULL);
1940
Chris Forbes04b61da2016-11-03 09:53:59 +13001941 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001942
Chris Forbes04b61da2016-11-03 09:53:59 +13001943 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001944 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1945
1946 validate_result(my_data->report_data, "vkBindImageMemory", result);
1947 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001948
1949 return result;
1950}
1951
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001952VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1953 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001954 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001956 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001957
Chris Forbes04b61da2016-11-03 09:53:59 +13001958 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001959
Chris Forbes04b61da2016-11-03 09:53:59 +13001960 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001961 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001962 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001963}
1964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001965VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001966 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001967 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001968 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001969
Chris Forbes04b61da2016-11-03 09:53:59 +13001970 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001971
Chris Forbes04b61da2016-11-03 09:53:59 +13001972 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001973 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001974 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001975}
1976
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1978 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001981 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001982 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1983 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001984 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 -06001985 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1987 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001988 return false;
1989 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001990 }
1991
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001992 return true;
1993}
1994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001995VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1996 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001997 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002000
Chris Forbes04b61da2016-11-03 09:53:59 +13002001 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002002 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002003
Chris Forbes04b61da2016-11-03 09:53:59 +13002004 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002005 get_dispatch_table(pc_device_table_map, device)
2006 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002007
2008 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2009 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002010}
2011
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002012bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2013 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2014 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes7b58a712016-11-24 11:35:31 +13002015 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002016 if (pProperties != nullptr) {
2017 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2018 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002019 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 -06002020 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002021 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2022 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002023 return false;
2024 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002025 }
2026
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002027 return true;
2028}
2029
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002030VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2031 VkImageType type, VkSampleCountFlagBits samples,
2032 VkImageUsageFlags usage, VkImageTiling tiling,
2033 uint32_t *pPropertyCount,
2034 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002035 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13002036 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002037 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002038
Chris Forbes04b61da2016-11-03 09:53:59 +13002039 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002040 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002041
Chris Forbes04b61da2016-11-03 09:53:59 +13002042 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13002043 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling,
2044 pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002045
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002046 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2047 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002048 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002049}
2050
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002051VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2052 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002053 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002054 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002055 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002057
Chris Forbes04b61da2016-11-03 09:53:59 +13002058 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002059
Chris Forbes04b61da2016-11-03 09:53:59 +13002060 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002061 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2062
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002063 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002064 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002065
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002066 return result;
2067}
2068
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002069VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2070 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002071 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002072 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002073 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002075
Chris Forbes04b61da2016-11-03 09:53:59 +13002076 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002077
Chris Forbes04b61da2016-11-03 09:53:59 +13002078 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2080
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002081 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002082 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002083
2084 return result;
2085}
2086
Chia-I Wu01ca2372016-05-13 14:37:49 +08002087VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002088 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002089 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002090 assert(my_data != NULL);
2091
Chris Forbes04b61da2016-11-03 09:53:59 +13002092 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002093
Chris Forbes04b61da2016-11-03 09:53:59 +13002094 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002095 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002096 }
2097}
2098
Chia-I Wu01ca2372016-05-13 14:37:49 +08002099VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002101 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002102 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002103 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002104
Chris Forbes04b61da2016-11-03 09:53:59 +13002105 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002106
Chris Forbes04b61da2016-11-03 09:53:59 +13002107 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2109
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002110 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002111 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002112
2113 return result;
2114}
2115
Chia-I Wu01ca2372016-05-13 14:37:49 +08002116VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002117 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002118 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002119 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2120 assert(my_data != NULL);
2121
Chris Forbes04b61da2016-11-03 09:53:59 +13002122 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002123
Chris Forbes04b61da2016-11-03 09:53:59 +13002124 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002125 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2126
2127 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2128 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002129
2130 return result;
2131}
2132
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002133VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2134 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002135 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002136 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002138 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002139
Chris Forbes04b61da2016-11-03 09:53:59 +13002140 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002141
Chris Forbes04b61da2016-11-03 09:53:59 +13002142 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002143 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2144
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002145 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002146 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002147
2148 return result;
2149}
2150
Chia-I Wu01ca2372016-05-13 14:37:49 +08002151VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002152 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002153 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002154 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002155 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002156 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002157
Chris Forbes04b61da2016-11-03 09:53:59 +13002158 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002159
Chris Forbes04b61da2016-11-03 09:53:59 +13002160 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2162
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002163 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002164 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002165
2166 return result;
2167}
2168
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002169VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002170 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002171 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002172 assert(my_data != NULL);
2173
Chris Forbes04b61da2016-11-03 09:53:59 +13002174 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002175
Chris Forbes04b61da2016-11-03 09:53:59 +13002176 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002177 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002178 }
2179}
2180
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002181VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2182 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002183 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002184 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002185 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002186 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002187
Chris Forbes04b61da2016-11-03 09:53:59 +13002188 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002189
Chris Forbes04b61da2016-11-03 09:53:59 +13002190 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002191 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2192
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002193 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002194 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002195
2196 return result;
2197}
2198
Chia-I Wu01ca2372016-05-13 14:37:49 +08002199VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002200 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002201 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002202 assert(my_data != NULL);
2203
Chris Forbes04b61da2016-11-03 09:53:59 +13002204 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002205
Chris Forbes04b61da2016-11-03 09:53:59 +13002206 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002207 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002208 }
2209}
2210
Chia-I Wu01ca2372016-05-13 14:37:49 +08002211VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002212 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002213 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002214 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2215 assert(my_data != NULL);
2216
Chris Forbes04b61da2016-11-03 09:53:59 +13002217 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002218
Chris Forbes04b61da2016-11-03 09:53:59 +13002219 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002220 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2221
2222 validate_result(my_data->report_data, "vkGetEventStatus", result);
2223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002224
2225 return result;
2226}
2227
Chia-I Wu01ca2372016-05-13 14:37:49 +08002228VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002229 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002230 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002231 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2232 assert(my_data != NULL);
2233
Chris Forbes04b61da2016-11-03 09:53:59 +13002234 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002235
Chris Forbes04b61da2016-11-03 09:53:59 +13002236 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002237 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2238
2239 validate_result(my_data->report_data, "vkSetEvent", result);
2240 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002241
2242 return result;
2243}
2244
Chia-I Wu01ca2372016-05-13 14:37:49 +08002245VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002246 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002247 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002248 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2249 assert(my_data != NULL);
2250
Chris Forbes04b61da2016-11-03 09:53:59 +13002251 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002252
Chris Forbes04b61da2016-11-03 09:53:59 +13002253 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002254 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2255
2256 validate_result(my_data->report_data, "vkResetEvent", result);
2257 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002258
2259 return result;
2260}
2261
Chia-I Wu01ca2372016-05-13 14:37:49 +08002262VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002263 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002264 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002265 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002266 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2267 assert(device_data != nullptr);
2268 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002269
Chris Forbes04b61da2016-11-03 09:53:59 +13002270 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002271
Dustin Gravesc900f572016-05-16 11:07:59 -06002272 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2273 if (pCreateInfo != nullptr) {
2274 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2275 // VkQueryPipelineStatisticFlagBits values
2276 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2277 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002278 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002279 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2280 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2281 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2282 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2283 }
2284 }
2285
Chris Forbes04b61da2016-11-03 09:53:59 +13002286 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002287 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2288
Dustin Gravesc900f572016-05-16 11:07:59 -06002289 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002290 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002291
2292 return result;
2293}
2294
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002295VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002296 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002297 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002298 assert(my_data != NULL);
2299
Chris Forbes04b61da2016-11-03 09:53:59 +13002300 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002301
Chris Forbes04b61da2016-11-03 09:53:59 +13002302 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002303 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002304 }
2305}
2306
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002307VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2308 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002309 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002310 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002311 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002312 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002313
Chris Forbes04b61da2016-11-03 09:53:59 +13002314 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002315 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316
Chris Forbes04b61da2016-11-03 09:53:59 +13002317 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002318 result = get_dispatch_table(pc_device_table_map, device)
2319 ->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) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002378 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2379
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) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002394 get_dispatch_table(pc_device_table_map, device)->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) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002408 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2409
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) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002424 get_dispatch_table(pc_device_table_map, device)->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) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002521 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2522
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) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002537 get_dispatch_table(pc_device_table_map, device)->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
2567 get_dispatch_table(pc_device_table_map, device)->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) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002630 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2631
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) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002646 get_dispatch_table(pc_device_table_map, device)->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 =
2661 get_dispatch_table(pc_device_table_map, device)->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) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002678 get_dispatch_table(pc_device_table_map, device)->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 =
2693 get_dispatch_table(pc_device_table_map, device)->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) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002710 get_dispatch_table(pc_device_table_map, device)->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) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002724 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2725
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) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002742 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2743
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
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003214 result = get_dispatch_table(pc_device_table_map, device)
3215 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003216
Dustin Gravesc900f572016-05-16 11:07:59 -06003217 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003218 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003219
3220 return result;
3221}
3222
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003223bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003224 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3225
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003226 if (pCreateInfos != nullptr) {
3227 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003228 uint32_t i = 0;
3229 validate_string(data->report_data, "vkCreateComputePipelines",
3230 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003231 }
3232
3233 return true;
3234}
3235
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003236VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3237 const VkComputePipelineCreateInfo *pCreateInfos,
3238 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003239 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003240 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003241 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003242 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003243
Chris Forbes04b61da2016-11-03 09:53:59 +13003244 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003245 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003246
Chris Forbes04b61da2016-11-03 09:53:59 +13003247 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003248 PreCreateComputePipelines(device, pCreateInfos);
3249
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003250 result = get_dispatch_table(pc_device_table_map, device)
3251 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003252
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003253 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003254 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003255
3256 return result;
3257}
3258
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003259VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003260 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003261 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003262 assert(my_data != NULL);
3263
Chris Forbes04b61da2016-11-03 09:53:59 +13003264 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003265
Chris Forbes04b61da2016-11-03 09:53:59 +13003266 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003267 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003268 }
3269}
3270
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003271VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3272 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003273 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003274 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003275 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003276 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003277
Chris Forbes04b61da2016-11-03 09:53:59 +13003278 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003279
Chris Forbes04b61da2016-11-03 09:53:59 +13003280 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003281 result =
3282 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003283
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003284 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003285 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003286
3287 return result;
3288}
3289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003290VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3291 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003292 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003293 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003294 assert(my_data != NULL);
3295
Chris Forbes04b61da2016-11-03 09:53:59 +13003296 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003297
Chris Forbes04b61da2016-11-03 09:53:59 +13003298 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003299 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003300 }
3301}
3302
Chia-I Wu01ca2372016-05-13 14:37:49 +08003303VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3304 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003305 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003306 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003307 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3308 assert(device_data != NULL);
3309 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003310
Chris Forbes04b61da2016-11-03 09:53:59 +13003311 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003312
Dustin Gravesc900f572016-05-16 11:07:59 -06003313 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3314 if (pCreateInfo != nullptr) {
3315 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3316 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003317 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003318 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3319 }
3320
3321 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3322 // valid VkBorderColor value
3323 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3324 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3325 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003326 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003327 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3328 }
3329 }
3330
Chris Forbes04b61da2016-11-03 09:53:59 +13003331 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003332 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3333
Dustin Gravesc900f572016-05-16 11:07:59 -06003334 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003335 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003336
3337 return result;
3338}
3339
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003340VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003341 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003342 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003343 assert(my_data != NULL);
3344
Chris Forbes04b61da2016-11-03 09:53:59 +13003345 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003346
Chris Forbes04b61da2016-11-03 09:53:59 +13003347 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003348 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003349 }
3350}
3351
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003352VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3353 const VkAllocationCallbacks *pAllocator,
3354 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003355 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003356 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003357 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3358 assert(device_data != nullptr);
3359 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003360
Chris Forbes04b61da2016-11-03 09:53:59 +13003361 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003362
Dustin Gravesc900f572016-05-16 11:07:59 -06003363 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3364 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3365 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3366 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3367 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3368 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3369 // valid VkSampler handles
3370 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3371 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3372 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3373 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3374 ++descriptor_index) {
3375 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003376 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003377 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3378 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3379 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3380 " specified as VK_NULL_HANDLE",
3381 i, descriptor_index);
3382 }
3383 }
3384 }
3385
3386 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3387 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3388 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003389 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003390 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3391 UNRECOGNIZED_VALUE, LayerName,
3392 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3393 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3394 i, i);
3395 }
3396 }
3397 }
3398 }
3399
Chris Forbes04b61da2016-11-03 09:53:59 +13003400 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003401 result =
3402 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003403
Dustin Gravesc900f572016-05-16 11:07:59 -06003404 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003405 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003406
3407 return result;
3408}
3409
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003410VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3411 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003412 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003413 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003414 assert(my_data != NULL);
3415
Chris Forbes04b61da2016-11-03 09:53:59 +13003416 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003417
Chris Forbes04b61da2016-11-03 09:53:59 +13003418 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003419 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003420 }
3421}
3422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003423VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3424 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003425 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003426 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003427 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003428 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003429
Chris Forbes04b61da2016-11-03 09:53:59 +13003430 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003431
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003432 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3433
Chris Forbes04b61da2016-11-03 09:53:59 +13003434 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003435 result =
3436 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003437
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003438 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003439 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003440
3441 return result;
3442}
3443
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003444VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3445 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003446 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003447 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003448 assert(my_data != NULL);
3449
Chris Forbes04b61da2016-11-03 09:53:59 +13003450 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003451
Chris Forbes04b61da2016-11-03 09:53:59 +13003452 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003453 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003454 }
3455}
3456
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003457VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3458 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003459 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003460 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003461 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3462 assert(my_data != NULL);
3463
Chris Forbes04b61da2016-11-03 09:53:59 +13003464 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003465
Chris Forbes04b61da2016-11-03 09:53:59 +13003466 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003467 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3468
3469 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3470 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003471
3472 return result;
3473}
3474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003475VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3476 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003477 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003478 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003479 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003480 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003481
Chris Forbes04b61da2016-11-03 09:53:59 +13003482 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003483
Chris Forbes04b61da2016-11-03 09:53:59 +13003484 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003485 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3486
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003487 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003488 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003489
3490 return result;
3491}
3492
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003493VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003494 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003495 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003496 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003497 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3498 assert(device_data != nullptr);
3499 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003500
Chris Forbes04b61da2016-11-03 09:53:59 +13003501 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003502
Dustin Gravesc900f572016-05-16 11:07:59 -06003503 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3504 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3505 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003506 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003507 pDescriptorSets, true, true);
3508
Chris Forbes04b61da2016-11-03 09:53:59 +13003509 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003510 result = get_dispatch_table(pc_device_table_map, device)
3511 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003512
Dustin Gravesc900f572016-05-16 11:07:59 -06003513 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003514 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003515
3516 return result;
3517}
3518
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003519VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3520 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3521 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003522 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003523 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3524 assert(device_data != NULL);
3525 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003526
Chris Forbes04b61da2016-11-03 09:53:59 +13003527 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003528 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003529
Dustin Gravesc900f572016-05-16 11:07:59 -06003530 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3531 if (pDescriptorWrites != NULL) {
3532 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3533 // descriptorCount must be greater than 0
3534 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003535 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003536 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3537 REQUIRED_PARAMETER, LayerName,
3538 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3539 }
3540
3541 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3542 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3543 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3544 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3545 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3546 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3547 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3548 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3549 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003550 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 -06003551 __LINE__, REQUIRED_PARAMETER, LayerName,
3552 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3553 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3554 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3555 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3556 i, i);
3557 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3558 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3559 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3560 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3561 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3562 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003563 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003564 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3565 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003566 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003567 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003568 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3569 ParameterName::IndexVector{i, descriptor_index}),
3570 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003571 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3572 }
3573 }
3574 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3575 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3576 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3577 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3578 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3579 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3580 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3581 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003582 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 -06003583 __LINE__, REQUIRED_PARAMETER, LayerName,
3584 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3585 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3586 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3587 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3588 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003589 } else {
3590 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003591 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003592 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3593 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003594 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3595 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003596 }
3597 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3598 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3599 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3600 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3601 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003602 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 -06003603 __LINE__, REQUIRED_PARAMETER, LayerName,
3604 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3605 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3606 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3607 i, i);
3608 } else {
3609 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3610 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003611 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003612 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3613 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003614 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3615 }
3616 }
3617 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003618
3619 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3620 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3621 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3622 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3623 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3624 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003625 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003626 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003627 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003628 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3629 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3630 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3631 }
3632 }
3633 }
3634 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3635 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3636 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3637 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3638 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3639 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003640 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003641 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003642 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003643 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3644 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3645 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3646 }
3647 }
3648 }
3649 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003650 }
3651 }
3652
Chris Forbes04b61da2016-11-03 09:53:59 +13003653 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003654 get_dispatch_table(pc_device_table_map, device)
3655 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003656 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003657}
3658
Chia-I Wu01ca2372016-05-13 14:37:49 +08003659VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003660 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003661 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003662 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003663 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003664 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003665
Chris Forbes04b61da2016-11-03 09:53:59 +13003666 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003667
Chris Forbes04b61da2016-11-03 09:53:59 +13003668 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003669 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3670
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003671 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003672 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003673
3674 return result;
3675}
3676
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003677VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003678 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003679 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003680 assert(my_data != NULL);
3681
Chris Forbes04b61da2016-11-03 09:53:59 +13003682 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003683
Chris Forbes04b61da2016-11-03 09:53:59 +13003684 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003685 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003686 }
3687}
3688
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003689bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003690 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003691 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3692
3693 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3694 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003695 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 -06003696 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003697 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3698 }
3699 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003700 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003701}
3702
Chia-I Wu01ca2372016-05-13 14:37:49 +08003703VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003704 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003705 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003706 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003707 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003708 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003709
Chris Forbes04b61da2016-11-03 09:53:59 +13003710 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3711 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003712
Chris Forbes04b61da2016-11-03 09:53:59 +13003713 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003714 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3715
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003716 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003717 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003718
3719 return result;
3720}
3721
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003722VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003723 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003725 assert(my_data != NULL);
3726
Chris Forbes04b61da2016-11-03 09:53:59 +13003727 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003728
Chris Forbes04b61da2016-11-03 09:53:59 +13003729 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003730 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003731 }
3732}
3733
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003734VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003735 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003736 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003737 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003738
Chris Forbes04b61da2016-11-03 09:53:59 +13003739 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003740
Chris Forbes04b61da2016-11-03 09:53:59 +13003741 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003742 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003743 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003744}
3745
Chia-I Wu01ca2372016-05-13 14:37:49 +08003746VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003747 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003748 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003749 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003750 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003751 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003752
Chris Forbes04b61da2016-11-03 09:53:59 +13003753 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003754 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003755
Chris Forbes04b61da2016-11-03 09:53:59 +13003756 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003757
Chris Forbes04b61da2016-11-03 09:53:59 +13003758 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003759 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3760
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003761 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003762 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003763
3764 return result;
3765}
3766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003767VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003768 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003769 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003770 assert(my_data != NULL);
3771
Chris Forbes04b61da2016-11-03 09:53:59 +13003772 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003773
Chris Forbes04b61da2016-11-03 09:53:59 +13003774 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003775 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003776 }
3777}
3778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003779VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003780 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003781 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003782 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3783 assert(my_data != NULL);
3784
Chris Forbes04b61da2016-11-03 09:53:59 +13003785 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003786
Chris Forbes04b61da2016-11-03 09:53:59 +13003787 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003788 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3789
3790 validate_result(my_data->report_data, "vkResetCommandPool", result);
3791 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003792
3793 return result;
3794}
3795
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003796VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3797 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003798 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003799 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003800 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003801 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003802
Chris Forbes04b61da2016-11-03 09:53:59 +13003803 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003804
Chris Forbes04b61da2016-11-03 09:53:59 +13003805 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003806 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3807
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003808 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003809 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003810
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003811 return result;
3812}
3813
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003814VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003815 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003816 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003817 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3818 assert(device_data != nullptr);
3819 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003820
Chris Forbes04b61da2016-11-03 09:53:59 +13003821 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003822
Dustin Gravesc900f572016-05-16 11:07:59 -06003823 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3824 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3825 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003826 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003827 pCommandBuffers, true, true);
3828
Chris Forbes04b61da2016-11-03 09:53:59 +13003829 if (!skip) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003830 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003831 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003832 }
3833}
3834
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003835bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003836 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003837 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3838 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3839
3840 if (pInfo != NULL) {
3841 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003842 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003843 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 -06003844 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003845 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3846 "inheritedQueries.");
3847 }
3848
3849 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3850 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003851 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003852 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 -06003853 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003854 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3855 "valid combination of VkQueryControlFlagBits.",
3856 pInfo->queryFlags);
3857 }
3858 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003859 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003860}
3861
3862VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003863 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003864 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003865 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3866 assert(device_data != nullptr);
3867 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003868
Chris Forbes04b61da2016-11-03 09:53:59 +13003869 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003870
Dustin Gravesc900f572016-05-16 11:07:59 -06003871 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3872 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003873 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003874 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3875 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3876
3877 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003878 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003879 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003880
Chris Forbes04b61da2016-11-03 09:53:59 +13003881 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003882 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3883
Dustin Gravesc900f572016-05-16 11:07:59 -06003884 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003885 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003886 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3887
3888 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003889 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003890 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3891 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3892 }
3893
Chris Forbes04b61da2016-11-03 09:53:59 +13003894 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003895
Chris Forbes04b61da2016-11-03 09:53:59 +13003896 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003897 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3898
Dustin Gravesc900f572016-05-16 11:07:59 -06003899 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003900 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003901
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003902 return result;
3903}
3904
Chia-I Wu01ca2372016-05-13 14:37:49 +08003905VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003906 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3907 assert(my_data != NULL);
3908
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003909 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003910
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003911 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003912
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003913 return result;
3914}
3915
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003916VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003917 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003918 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3919 assert(my_data != NULL);
3920
Chris Forbes04b61da2016-11-03 09:53:59 +13003921 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003922
Chris Forbes04b61da2016-11-03 09:53:59 +13003923 if (!skip) {
Dustin Graves16d18972016-05-09 17:36:57 -06003924 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3925
3926 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3927 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003928
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003929 return result;
3930}
3931
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003932VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3933 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003934 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003935 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3936 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937
Chris Forbes04b61da2016-11-03 09:53:59 +13003938 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003939
Chris Forbes04b61da2016-11-03 09:53:59 +13003940 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003941 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3942 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003943}
3944
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003945bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3946 debug_report_data *report_data = my_data->report_data;
3947
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003948 bool skip =
3949 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003950
3951 if (viewport_count > 0 && viewports != nullptr) {
3952 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3953 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3954 const VkViewport &viewport = viewports[viewportIndex];
3955
3956 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3957 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3958 VALIDATION_ERROR_01448, LayerName,
3959 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3960 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3961 }
3962
3963 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3964 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3965 // VALIDATION_ERROR_01790
3966 invalid_height = false;
3967 }
3968 if (invalid_height) {
3969 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3970 VALIDATION_ERROR_01449, LayerName,
3971 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3972 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3973 }
3974
3975 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3976 skip |=
3977 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3978 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3979 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3980 validation_error_map[VALIDATION_ERROR_01450]);
3981 }
3982
3983 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
3984 skip |=
3985 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3986 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
3987 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3988 validation_error_map[VALIDATION_ERROR_01450]);
3989 }
3990
3991 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
3992 skip |=
3993 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3994 VALIDATION_ERROR_01451, LayerName,
3995 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
3996 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
3997 }
3998
3999 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
4000 skip |=
4001 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4002 VALIDATION_ERROR_01452, LayerName,
4003 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
4004 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
4005 }
4006 }
4007 }
4008
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004009 return skip;
4010}
4011
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004012VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4013 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004014 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004015 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004016 assert(my_data != NULL);
4017
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004018 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004019
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004020 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004021 get_dispatch_table(pc_device_table_map, commandBuffer)
4022 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004023 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004024}
4025
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004026VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4027 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004028 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004029 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004030 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004031 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004032
Chris Forbes04b61da2016-11-03 09:53:59 +13004033 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004034
Mike Weiblena4742dc2016-10-31 11:05:56 -06004035 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4036 const VkRect2D &pScissor = pScissors[scissorIndex];
4037
4038 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004039 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 -06004040 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4041 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4042 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004043 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 -06004044 VALIDATION_ERROR_01490, LayerName,
4045 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4046 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4047 }
4048
4049 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004050 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 -06004051 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4052 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4053 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004054 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 -06004055 VALIDATION_ERROR_01491, LayerName,
4056 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4057 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4058 }
4059 }
4060
Chris Forbes04b61da2016-11-03 09:53:59 +13004061 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004062 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4063 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004064}
4065
Chia-I Wu01ca2372016-05-13 14:37:49 +08004066VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004067 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004068}
4069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004070VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4071 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004072 get_dispatch_table(pc_device_table_map, commandBuffer)
4073 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004074}
4075
Chia-I Wu01ca2372016-05-13 14:37:49 +08004076VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004077 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004078 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004079 assert(my_data != NULL);
4080
Chris Forbes04b61da2016-11-03 09:53:59 +13004081 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004082
Chris Forbes04b61da2016-11-03 09:53:59 +13004083 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004084 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4085 }
Cody Northrop12365112015-08-17 11:10:49 -06004086}
4087
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004088VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004089 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004090}
4091
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004092VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4093 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004094 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004095 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4096 assert(my_data != NULL);
4097
Chris Forbes04b61da2016-11-03 09:53:59 +13004098 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004099
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004101 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4102 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004103}
4104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004105VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004106 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004107 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4108 assert(my_data != NULL);
4109
Chris Forbes04b61da2016-11-03 09:53:59 +13004110 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004111
Chris Forbes04b61da2016-11-03 09:53:59 +13004112 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004113 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4114 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004115}
4116
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004117VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004118 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004119 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4120 assert(my_data != NULL);
4121
Chris Forbes04b61da2016-11-03 09:53:59 +13004122 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004123
Chris Forbes04b61da2016-11-03 09:53:59 +13004124 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004125 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4126 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004127}
4128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004129VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4130 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4131 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4132 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004133 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004134 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004135 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004136
Chris Forbes04b61da2016-11-03 09:53:59 +13004137 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004138 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4139 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004140
Chris Forbes04b61da2016-11-03 09:53:59 +13004141 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004142 get_dispatch_table(pc_device_table_map, commandBuffer)
4143 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4144 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004145 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004146}
4147
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004148VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4149 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004150 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004151 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4152 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004153
Chris Forbes04b61da2016-11-03 09:53:59 +13004154 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004155
Chris Forbes04b61da2016-11-03 09:53:59 +13004156 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004157 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4158 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004159}
4160
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004161VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4162 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004163 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004164 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004165 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004166
Chris Forbes04b61da2016-11-03 09:53:59 +13004167 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004168
Chris Forbes04b61da2016-11-03 09:53:59 +13004169 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004170 get_dispatch_table(pc_device_table_map, commandBuffer)
4171 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004172 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004173}
4174
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004175bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4176 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004177 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004178 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004179 // 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 -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 vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004183 return false;
4184 }
4185
4186 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004187 // 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 -07004188 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004189 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 -06004190 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004191 return false;
4192 }
4193
4194 return true;
4195}
4196
Chia-I Wu01ca2372016-05-13 14:37:49 +08004197VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4198 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004199 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004200
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004201 get_dispatch_table(pc_device_table_map, commandBuffer)
4202 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004203}
4204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004205VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4206 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004207 get_dispatch_table(pc_device_table_map, commandBuffer)
4208 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004209}
4210
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004211VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4212 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004213 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004214 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4215 assert(my_data != NULL);
4216
Chris Forbes04b61da2016-11-03 09:53:59 +13004217 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004218
Chris Forbes04b61da2016-11-03 09:53:59 +13004219 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004220 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4221 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004222}
4223
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004224VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4225 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004226 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004227 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4228 assert(my_data != NULL);
4229
Chris Forbes04b61da2016-11-03 09:53:59 +13004230 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004231
Chris Forbes04b61da2016-11-03 09:53:59 +13004232 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004233 get_dispatch_table(pc_device_table_map, commandBuffer)
4234 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4235 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004236}
4237
Chia-I Wu01ca2372016-05-13 14:37:49 +08004238VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004239 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004240}
4241
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004242VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004243 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4245 assert(my_data != NULL);
4246
Chris Forbes04b61da2016-11-03 09:53:59 +13004247 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004248
Chris Forbes04b61da2016-11-03 09:53:59 +13004249 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004250 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4251 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004252}
4253
Chia-I Wu01ca2372016-05-13 14:37:49 +08004254VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4255 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004256 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004257 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004258 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004259
Chris Forbes04b61da2016-11-03 09:53:59 +13004260 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004261
Chris Forbes04b61da2016-11-03 09:53:59 +13004262 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004263 get_dispatch_table(pc_device_table_map, commandBuffer)
4264 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004265 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004266}
4267
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004268bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004270 if (pRegions != nullptr) {
4271 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4272 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004273 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 -06004274 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004275 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4276 return false;
4277 }
4278 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4279 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004280 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 -06004281 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4283 return false;
4284 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004285 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004286
4287 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004288}
4289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004290VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4291 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4292 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004293 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004295 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004296
Chris Forbes04b61da2016-11-03 09:53:59 +13004297 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004298 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004299
Chris Forbes04b61da2016-11-03 09:53:59 +13004300 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004301 PreCmdCopyImage(commandBuffer, pRegions);
4302
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004303 get_dispatch_table(pc_device_table_map, commandBuffer)
4304 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004305 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004306}
4307
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004308bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004309 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004310 if (pRegions != nullptr) {
4311 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4312 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004313 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 -06004314 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004315 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4316 return false;
4317 }
4318 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4319 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004320 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 -06004321 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004322 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4323 return false;
4324 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004325 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004326
4327 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328}
4329
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004330VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4331 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4332 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004333 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004334 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004335 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004336
Chris Forbes04b61da2016-11-03 09:53:59 +13004337 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004338 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004339
Chris Forbes04b61da2016-11-03 09:53:59 +13004340 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004341 PreCmdBlitImage(commandBuffer, pRegions);
4342
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004343 get_dispatch_table(pc_device_table_map, commandBuffer)
4344 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004345 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004346}
4347
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004348bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004349 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004350 if (pRegions != nullptr) {
4351 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4352 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004353 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 -06004354 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004355 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4356 "enumerator");
4357 return false;
4358 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004359 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004360
4361 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004362}
4363
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004364VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4365 VkImageLayout dstImageLayout, uint32_t regionCount,
4366 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004367 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004368 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004369 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004370
Chris Forbes04b61da2016-11-03 09:53:59 +13004371 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004372 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004373
Chris Forbes04b61da2016-11-03 09:53:59 +13004374 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004375 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4376
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004377 get_dispatch_table(pc_device_table_map, commandBuffer)
4378 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004379 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004380}
4381
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004382bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004383 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004384 if (pRegions != nullptr) {
4385 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4386 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004387 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 -06004388 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004389 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4390 "enumerator");
4391 return false;
4392 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004393 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004394
4395 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004396}
4397
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004398VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4399 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004400 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004401 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004402 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004403
Chris Forbes04b61da2016-11-03 09:53:59 +13004404 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004405 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004406
Chris Forbes04b61da2016-11-03 09:53:59 +13004407 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004408 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4409
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004410 get_dispatch_table(pc_device_table_map, commandBuffer)
4411 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004412 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004413}
4414
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004415VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4416 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004417 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004419 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004420
Chris Forbes04b61da2016-11-03 09:53:59 +13004421 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004422
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004423 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004424 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004425 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4426 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004427 }
4428
4429 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004430 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004431 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4432 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004433 dataSize);
4434 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004435 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004436 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4437 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004438 }
4439
Chris Forbes04b61da2016-11-03 09:53:59 +13004440 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004441 get_dispatch_table(pc_device_table_map, commandBuffer)
4442 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004443 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004444}
4445
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004446VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4447 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004448 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004449 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4450 assert(my_data != NULL);
4451
Chris Forbes04b61da2016-11-03 09:53:59 +13004452 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004453
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004454 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004455 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004456 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4457 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004458 }
4459
4460 if (size != VK_WHOLE_SIZE) {
4461 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004462 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004463 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004464 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004465 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004466 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004467 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004468 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4469 }
4470 }
4471
Chris Forbes04b61da2016-11-03 09:53:59 +13004472 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004473 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4474 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004475}
4476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004477VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4478 const VkClearColorValue *pColor, 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_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004485
Chris Forbes04b61da2016-11-03 09:53:59 +13004486 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004487 get_dispatch_table(pc_device_table_map, commandBuffer)
4488 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004490}
4491
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004492VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4493 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4494 const VkImageSubresourceRange *pRanges) {
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_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004500 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004501
Chris Forbes04b61da2016-11-03 09:53:59 +13004502 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004503 get_dispatch_table(pc_device_table_map, commandBuffer)
4504 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004505 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004506}
4507
Chia-I Wu01ca2372016-05-13 14:37:49 +08004508VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4509 const VkClearAttachment *pAttachments, uint32_t rectCount,
4510 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004511 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004513 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004514
Chris Forbes04b61da2016-11-03 09:53:59 +13004515 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004516
Chris Forbes04b61da2016-11-03 09:53:59 +13004517 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004518 get_dispatch_table(pc_device_table_map, commandBuffer)
4519 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004520 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004521}
4522
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004523bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004524 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004525 if (pRegions != nullptr) {
4526 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4527 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4528 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004529 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 -06004530 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004531 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4532 return false;
4533 }
4534 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4535 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4536 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004537 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 -06004538 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004539 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4540 return false;
4541 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004542 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004543
4544 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004545}
4546
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004547VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4548 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4549 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004550 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004551 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004552 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004553
Chris Forbes04b61da2016-11-03 09:53:59 +13004554 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004555 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004556
Chris Forbes04b61da2016-11-03 09:53:59 +13004557 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004558 PreCmdResolveImage(commandBuffer, pRegions);
4559
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004560 get_dispatch_table(pc_device_table_map, commandBuffer)
4561 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004562 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004563}
4564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004565VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004566 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004567 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4568 assert(my_data != NULL);
4569
Chris Forbes04b61da2016-11-03 09:53:59 +13004570 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004571
Chris Forbes04b61da2016-11-03 09:53:59 +13004572 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004573 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4574 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004575}
4576
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004577VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004578 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004579 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4580 assert(my_data != NULL);
4581
Chris Forbes04b61da2016-11-03 09:53:59 +13004582 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004583
Chris Forbes04b61da2016-11-03 09:53:59 +13004584 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004585 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4586 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004587}
4588
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004589VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4590 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4591 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4592 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4593 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004594 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004595 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004596 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004597
Chris Forbes04b61da2016-11-03 09:53:59 +13004598 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004599 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4600 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004601
Chris Forbes04b61da2016-11-03 09:53:59 +13004602 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004603 get_dispatch_table(pc_device_table_map, commandBuffer)
4604 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4605 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 CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4610 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4611 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4612 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4613 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004614 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004615 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004616 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004617
Chris Forbes04b61da2016-11-03 09:53:59 +13004618 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004619 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4620 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004621
Chris Forbes04b61da2016-11-03 09:53:59 +13004622 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004623 get_dispatch_table(pc_device_table_map, commandBuffer)
4624 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4625 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004626 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004627}
4628
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004629VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4630 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004631 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004632 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4633 assert(my_data != NULL);
4634
Chris Forbes04b61da2016-11-03 09:53:59 +13004635 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004636
Chris Forbes04b61da2016-11-03 09:53:59 +13004637 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004638 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4639 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004640}
4641
Chia-I Wu01ca2372016-05-13 14:37:49 +08004642VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004643 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004644 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4645 assert(my_data != NULL);
4646
Chris Forbes04b61da2016-11-03 09:53:59 +13004647 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004648
Chris Forbes04b61da2016-11-03 09:53:59 +13004649 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004650 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4651 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004652}
4653
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004654VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4655 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004656 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004657 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4658 assert(my_data != NULL);
4659
Chris Forbes04b61da2016-11-03 09:53:59 +13004660 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004661
Chris Forbes04b61da2016-11-03 09:53:59 +13004662 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004663 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4664 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004665}
4666
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004667bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4668 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004669
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004670 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004671
4672 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004673}
4674
Chia-I Wu01ca2372016-05-13 14:37:49 +08004675VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4676 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004677 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4679 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004680
Chris Forbes04b61da2016-11-03 09:53:59 +13004681 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004682
Chris Forbes04b61da2016-11-03 09:53:59 +13004683 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004684 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4685
4686 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4687 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004688}
4689
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004690VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4691 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4692 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004693 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004694 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4695 assert(my_data != NULL);
4696
Chris Forbes04b61da2016-11-03 09:53:59 +13004697 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004698 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004699
Chris Forbes04b61da2016-11-03 09:53:59 +13004700 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004701 get_dispatch_table(pc_device_table_map, commandBuffer)
4702 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4703 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004704}
4705
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004706VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4707 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004708 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004709 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004710 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004711
Chris Forbes04b61da2016-11-03 09:53:59 +13004712 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004713
Chris Forbes04b61da2016-11-03 09:53:59 +13004714 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004715 get_dispatch_table(pc_device_table_map, commandBuffer)
4716 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004717 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004718}
4719
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004720VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4721 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004722 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004724 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004725
Chris Forbes04b61da2016-11-03 09:53:59 +13004726 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004727
Chris Forbes04b61da2016-11-03 09:53:59 +13004728 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004729 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004730 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004731}
4732
Chia-I Wu01ca2372016-05-13 14:37:49 +08004733VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004734 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004735 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4736 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004737
Chris Forbes04b61da2016-11-03 09:53:59 +13004738 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004739
Chris Forbes04b61da2016-11-03 09:53:59 +13004740 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004741 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4742 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004743}
4744
Chia-I Wu01ca2372016-05-13 14:37:49 +08004745VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004746 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004747}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004749VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4750 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004751 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004752 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004753 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004754
Chris Forbes04b61da2016-11-03 09:53:59 +13004755 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004756
Chris Forbes04b61da2016-11-03 09:53:59 +13004757 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004758 get_dispatch_table(pc_device_table_map, commandBuffer)
4759 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004760 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004761}
4762
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004763VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004764 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4765}
4766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004767VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4768 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004769 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4770}
4771
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004772VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4773 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004774 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4775 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4776
4777 return VK_ERROR_LAYER_NOT_PRESENT;
4778}
4779
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004780VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4781 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004782 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004783 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004784 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004785
4786 assert(physicalDevice);
4787
Chris Forbes6444bba2016-11-24 14:15:23 +13004788 return get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map)
4789 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004790}
4791
Chris Forbes448ebcb2016-11-03 09:29:52 +13004792bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4793{
4794 if (!(my_data->*flag)) {
4795 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4796 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4797 "%s() called even though the %s extension was not enabled for this VkDevice.",
4798 function_name, extension_name);
4799 }
4800
4801 return false;
4802}
4803
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804// WSI Extension Functions
4805
4806VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004807 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004808 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004809 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004810 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4811 assert(my_data != NULL);
4812
Chris Forbes04b61da2016-11-03 09:53:59 +13004813 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004814
Chris Forbes04b61da2016-11-03 09:53:59 +13004815 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004816
Chris Forbes04b61da2016-11-03 09:53:59 +13004817 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004818 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4819
4820 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4821 }
4822
4823 return result;
4824}
4825
4826VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004827 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004828 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004829 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004830 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4831 assert(my_data != NULL);
4832
Chris Forbes04b61da2016-11-03 09:53:59 +13004833 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004834
Chris Forbes04b61da2016-11-03 09:53:59 +13004835 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004836 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4837
Chris Forbes04b61da2016-11-03 09:53:59 +13004838 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004839 result = get_dispatch_table(pc_device_table_map, device)
4840 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4841
4842 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4843 }
4844
4845 return result;
4846}
4847
4848VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004849 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004850 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004851 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004852 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4853 assert(my_data != NULL);
4854
Chris Forbes04b61da2016-11-03 09:53:59 +13004855 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004856
Chris Forbes04b61da2016-11-03 09:53:59 +13004857 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004858 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4859
Chris Forbes04b61da2016-11-03 09:53:59 +13004860 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004861 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004862 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004863
4864 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4865 }
4866
4867 return result;
4868}
4869
4870VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4871 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004872 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4874 assert(my_data != NULL);
4875
Chris Forbes04b61da2016-11-03 09:53:59 +13004876 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004877
Chris Forbes04b61da2016-11-03 09:53:59 +13004878 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004879
Chris Forbes04b61da2016-11-03 09:53:59 +13004880 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004881 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4882
4883 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4884 }
4885
4886 return result;
4887}
4888
Chris Forbesbe5f5202016-11-02 18:34:25 +13004889VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004890 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004891 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4892 assert(my_data != NULL);
4893
Chris Forbes04b61da2016-11-03 09:53:59 +13004894 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004895
4896 /* No generated validation function for this call */
4897
Chris Forbes04b61da2016-11-03 09:53:59 +13004898 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13004899 get_dispatch_table(pc_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
4900 }
4901}
4902
Chris Forbes115f98c2016-11-03 09:51:48 +13004903bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4904{
Chris Forbes6be763e2016-11-24 12:42:33 +13004905 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
4906 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13004907 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4908 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4909 "%s() called even though the %s extension was not enabled for this VkInstance.",
4910 function_name, extension_name);
4911 }
4912
4913 return false;
4914}
4915
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004916VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4917 VkSurfaceKHR surface, VkBool32 *pSupported) {
4918 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004919 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004920 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004921 assert(my_data != NULL);
4922
Chris Forbes04b61da2016-11-03 09:53:59 +13004923 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004924 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004925
Chris Forbes04b61da2016-11-03 09:53:59 +13004926 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004927 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4928
Chris Forbes04b61da2016-11-03 09:53:59 +13004929 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004930 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004931
4932 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4933 }
4934
4935 return result;
4936}
4937
4938VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4939 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4940 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004941 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004942 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004943 assert(my_data != NULL);
4944
Chris Forbes04b61da2016-11-03 09:53:59 +13004945 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004946 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004947
Chris Forbes04b61da2016-11-03 09:53:59 +13004948 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004949 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004950
Chris Forbes04b61da2016-11-03 09:53:59 +13004951 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004952 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953
4954 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4955 }
4956
4957 return result;
4958}
4959
4960VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4961 uint32_t *pSurfaceFormatCount,
4962 VkSurfaceFormatKHR *pSurfaceFormats) {
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 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004970
Chris Forbes04b61da2016-11-03 09:53:59 +13004971 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004972 pSurfaceFormats);
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.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
4976 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004977
4978 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4979 }
4980
4981 return result;
4982}
4983
4984VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4985 uint32_t *pPresentModeCount,
4986 VkPresentModeKHR *pPresentModes) {
4987 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004988 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004989 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004990 assert(my_data != NULL);
4991
Chris Forbes04b61da2016-11-03 09:53:59 +13004992 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004993 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004994
Chris Forbes04b61da2016-11-03 09:53:59 +13004995 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004996 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004997
Chris Forbes04b61da2016-11-03 09:53:59 +13004998 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004999 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
5000 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005001
5002 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
5003 }
5004
5005 return result;
5006}
5007
Chris Forbesbe5f5202016-11-02 18:34:25 +13005008VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005009 bool skip = false;
Chris Forbes6444bba2016-11-24 14:15:23 +13005010 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005011
Chris Forbes04b61da2016-11-03 09:53:59 +13005012 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005013 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005014
Chris Forbes04b61da2016-11-03 09:53:59 +13005015 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005016 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005017 }
5018}
5019
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005020#ifdef VK_USE_PLATFORM_WIN32_KHR
5021VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
5022 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5023 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5024
Chris Forbes7b58a712016-11-24 11:35:31 +13005025 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005026 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005027 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005028
Chris Forbes04b61da2016-11-03 09:53:59 +13005029 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005030 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005031
Chris Forbes04b61da2016-11-03 09:53:59 +13005032 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005033
Chris Forbes04b61da2016-11-03 09:53:59 +13005034 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005035 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005036 }
5037
5038 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5039
5040 return result;
5041}
Chris Forbes9a083b92016-11-02 16:58:15 +13005042
5043VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5044 uint32_t queueFamilyIndex)
5045{
5046 VkBool32 result = false;
5047
Chris Forbes7b58a712016-11-24 11:35:31 +13005048 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005049 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005050 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005051
Chris Forbes04b61da2016-11-03 09:53:59 +13005052 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005053 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005054
Chris Forbes7281a502016-11-08 08:45:03 +13005055 // TODO: codegen doesn't produce this function?
5056 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005057
Chris Forbes04b61da2016-11-03 09:53:59 +13005058 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005059 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005060 }
5061
5062 return result;
5063}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005064#endif // VK_USE_PLATFORM_WIN32_KHR
5065
5066#ifdef VK_USE_PLATFORM_XCB_KHR
5067VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5068 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5069 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5070
Chris Forbes7b58a712016-11-24 11:35:31 +13005071 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005072 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005073 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005074
Chris Forbes04b61da2016-11-03 09:53:59 +13005075 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005076 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005077
Chris Forbes04b61da2016-11-03 09:53:59 +13005078 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
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.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005082 }
5083
5084 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5085
5086 return result;
5087}
5088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005089VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5090 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5091 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005092 VkBool32 result = false;
5093
Chris Forbes7b58a712016-11-24 11:35:31 +13005094 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), 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(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005099 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005100
Chris Forbes04b61da2016-11-03 09:53:59 +13005101 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005102 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005103
Chris Forbes04b61da2016-11-03 09:53:59 +13005104 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005105 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5106 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005107 }
5108
5109 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005110}
5111#endif // VK_USE_PLATFORM_XCB_KHR
5112
5113#ifdef VK_USE_PLATFORM_XLIB_KHR
5114VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005115 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005116 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5117
Chris Forbes7b58a712016-11-24 11:35:31 +13005118 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005119 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005120 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005121
Chris Forbes04b61da2016-11-03 09:53:59 +13005122 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005123 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005124
Chris Forbes04b61da2016-11-03 09:53:59 +13005125 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005126
Chris Forbes04b61da2016-11-03 09:53:59 +13005127 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005128 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005129 }
5130
5131 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5132
5133 return result;
5134}
5135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005136VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5137 uint32_t queueFamilyIndex, Display *dpy,
5138 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005139 VkBool32 result = false;
5140
Chris Forbes7b58a712016-11-24 11:35:31 +13005141 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005142 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005143 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005144
Chris Forbes04b61da2016-11-03 09:53:59 +13005145 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005146 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005147
Chris Forbes04b61da2016-11-03 09:53:59 +13005148 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005149
Chris Forbes04b61da2016-11-03 09:53:59 +13005150 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005151 result =
5152 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005153 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005154 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005155}
5156#endif // VK_USE_PLATFORM_XLIB_KHR
5157
5158#ifdef VK_USE_PLATFORM_MIR_KHR
5159VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005160 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005161 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5162
Chris Forbes7b58a712016-11-24 11:35:31 +13005163 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005164 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005166
Chris Forbes04b61da2016-11-03 09:53:59 +13005167 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005168 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005169
Chris Forbes04b61da2016-11-03 09:53:59 +13005170 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005171
Chris Forbes04b61da2016-11-03 09:53:59 +13005172 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005173 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005174 }
5175
5176 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5177
5178 return result;
5179}
5180
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005181VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5182 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005183 VkBool32 result = false;
5184
Chris Forbes7b58a712016-11-24 11:35:31 +13005185 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005186 assert(my_data != NULL);
5187
Chris Forbes04b61da2016-11-03 09:53:59 +13005188 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005189
Chris Forbes04b61da2016-11-03 09:53:59 +13005190 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005191 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5192
Chris Forbes04b61da2016-11-03 09:53:59 +13005193 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005194
Chris Forbes04b61da2016-11-03 09:53:59 +13005195 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005196 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005197 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005198 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005199}
5200#endif // VK_USE_PLATFORM_MIR_KHR
5201
5202#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5203VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005204 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005205 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5206
Chris Forbes7b58a712016-11-24 11:35:31 +13005207 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005208 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005209 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005210
Chris Forbes04b61da2016-11-03 09:53:59 +13005211 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005212 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5213
Chris Forbes04b61da2016-11-03 09:53:59 +13005214 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
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.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005218 }
5219
5220 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5221
5222 return result;
5223}
5224
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005225VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5226 uint32_t queueFamilyIndex,
5227 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005228 VkBool32 result = false;
5229
Chris Forbes7b58a712016-11-24 11:35:31 +13005230 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005231 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005232 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005233
Chris Forbes04b61da2016-11-03 09:53:59 +13005234 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005235 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5236
Chris Forbes04b61da2016-11-03 09:53:59 +13005237 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005238 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005239
Chris Forbes04b61da2016-11-03 09:53:59 +13005240 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005241 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005242 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005243
5244 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005245}
5246#endif // VK_USE_PLATFORM_WAYLAND_KHR
5247
5248#ifdef VK_USE_PLATFORM_ANDROID_KHR
5249VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005250 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005251 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5252
Chris Forbes7b58a712016-11-24 11:35:31 +13005253 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005254 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005255 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005256
Chris Forbes04b61da2016-11-03 09:53:59 +13005257 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005258 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005259
Chris Forbes04b61da2016-11-03 09:53:59 +13005260 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005261
Chris Forbes04b61da2016-11-03 09:53:59 +13005262 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005263 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005264 }
5265
5266 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5267
5268 return result;
5269}
5270#endif // VK_USE_PLATFORM_ANDROID_KHR
5271
Mark Youngead9b932016-09-08 12:28:38 -06005272VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5273 const VkSwapchainCreateInfoKHR *pCreateInfos,
5274 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5275 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005276 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005277 auto my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005278 assert(my_data != NULL);
5279
Chris Forbes04b61da2016-11-03 09:53:59 +13005280 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 +13005281
Chris Forbes04b61da2016-11-03 09:53:59 +13005282 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005283 pSwapchains);
5284
Chris Forbes04b61da2016-11-03 09:53:59 +13005285 if (!skip) {
Mark Youngead9b932016-09-08 12:28:38 -06005286 result = get_dispatch_table(pc_device_table_map, device)
5287 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5288
5289 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5290 }
5291
5292 return result;
5293}
5294
Chris Forbes667a5212016-11-03 10:18:35 +13005295VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5296 VkDisplayPropertiesKHR *pProperties) {
5297 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5298 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005299 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005300 assert(my_data != NULL);
5301
5302 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5303 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5304
5305 // No parameter validation function for this call?
5306
5307 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005308 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005309
5310 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5311 }
5312
5313 return result;
5314}
5315
5316VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5317 VkDisplayPlanePropertiesKHR *pProperties) {
5318 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5319 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005320 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005321 assert(my_data != NULL);
5322
5323 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5324 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5325
5326 // No parameter validation function for this call?
5327
5328 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005329 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005330
5331 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5332 }
5333
5334 return result;
5335}
5336
5337VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5338 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5339 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5340 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005341 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005342 assert(my_data != NULL);
5343
5344 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5345 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5346
5347 // No parameter validation function for this call?
5348
5349 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005350 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005351
5352 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5353 }
5354
5355 return result;
5356}
5357
5358VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5359 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5360 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5361 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005362 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005363 assert(my_data != NULL);
5364
5365 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5366 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5367
5368 // No parameter validation function for this call?
5369
5370 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005371 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005372
5373 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5374 }
5375
5376 return result;
5377}
5378
5379VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5380 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5381 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5382 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5383 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005384 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005385 assert(my_data != NULL);
5386
5387 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5388 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5389
5390 // No parameter validation function for this call?
5391
5392 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005393 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005394
5395 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5396 }
5397
5398 return result;
5399}
5400
5401VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5402 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5403 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5404 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005405 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005406 assert(my_data != NULL);
5407
5408 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5409 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5410
5411 // No parameter validation function for this call?
5412
5413 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005414 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005415
5416 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5417 }
5418
5419 return result;
5420}
5421
5422VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5423 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5424 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5425 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005426 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005427 assert(my_data != NULL);
5428
5429 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5430 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5431
5432 // No parameter validation function for this call?
5433
5434 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005435 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005436
5437 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5438 }
5439
5440 return result;
5441}
5442
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005443// VK_EXT_debug_marker Extension
5444VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5445 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005446 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005447 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5448 assert(my_data != NULL);
5449
Chris Forbes04b61da2016-11-03 09:53:59 +13005450 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005451
Chris Forbes04b61da2016-11-03 09:53:59 +13005452 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005453 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5454
5455 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5456 }
5457
5458 return result;
5459}
5460
5461VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5462 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005463 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005464 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5465 assert(my_data != NULL);
5466
Chris Forbes04b61da2016-11-03 09:53:59 +13005467 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005468
Chris Forbes04b61da2016-11-03 09:53:59 +13005469 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005470 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5471
5472 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5473 }
5474
5475 return result;
5476}
5477
5478VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005479 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005480 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5481 assert(my_data != NULL);
5482
Chris Forbes04b61da2016-11-03 09:53:59 +13005483 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005484
Chris Forbes04b61da2016-11-03 09:53:59 +13005485 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005486 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5487 }
5488}
5489
5490VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005491 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5493 assert(my_data != NULL);
5494
Chris Forbes04b61da2016-11-03 09:53:59 +13005495 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005496
Chris Forbes04b61da2016-11-03 09:53:59 +13005497 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005498 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5499 }
5500}
5501
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005502// VK_NV_external_memory_capabilities Extension
5503VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5504 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5505 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5506 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5507
5508 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005509 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005510 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005511 assert(my_data != NULL);
5512
Chris Forbes04b61da2016-11-03 09:53:59 +13005513 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005514 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5515
Chris Forbes04b61da2016-11-03 09:53:59 +13005516 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005517 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
5518 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005519
5520 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5521 }
5522
5523 return result;
5524}
5525
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005526#ifdef VK_USE_PLATFORM_WIN32_KHR
5527// VK_NV_external_memory_win32 Extension
5528VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5529 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5530
5531 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005532 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005533 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5534 assert(my_data != NULL);
5535
Chris Forbes04b61da2016-11-03 09:53:59 +13005536 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005537
Chris Forbes04b61da2016-11-03 09:53:59 +13005538 if (!skip) {
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005539 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5540 }
5541
5542 return result;
5543}
5544#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005545
5546
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005547
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005548static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005549
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005550static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005552static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005554static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005555
Chia-I Wu01ca2372016-05-13 14:37:49 +08005556VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005557 assert(device);
5558
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005559 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5560
Dustin Graves080069b2016-04-05 13:48:15 -06005561 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005562 return NULL;
5563 }
5564
Chia-I Wuf9b01382016-05-16 07:37:41 +08005565 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5566 if (proc)
5567 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005568
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005569 proc = InterceptWsiEnabledCommand(funcName, device);
5570 if (proc)
5571 return proc;
5572
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005573 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005574 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005575 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005576}
5577
Chia-I Wu01ca2372016-05-13 14:37:49 +08005578VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005579 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005580 if (!proc)
5581 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005582
5583 if (!proc)
5584 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005585
Chia-I Wu617f2a42016-05-16 07:41:17 +08005586 if (proc)
5587 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005588
Chia-I Wu617f2a42016-05-16 07:41:17 +08005589 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005590
Chris Forbes7b58a712016-11-24 11:35:31 +13005591 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005592
Chia-I Wu617f2a42016-05-16 07:41:17 +08005593 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005594 if (!proc)
5595 proc = InterceptWsiEnabledCommand(funcName, instance);
5596
Chia-I Wu617f2a42016-05-16 07:41:17 +08005597 if (proc)
5598 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005599
Chris Forbes6444bba2016-11-24 14:15:23 +13005600 if (!data->dispatch_table.GetInstanceProcAddr)
5601 return nullptr;
5602 return data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005603}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005604
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005605static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005606 static const struct {
5607 const char *name;
5608 PFN_vkVoidFunction proc;
5609 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005610 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5611 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5612 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5613 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5614 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5615 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5616 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5617 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5618 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5619 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5620 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5621 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5622 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5623 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5624 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5625 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5626 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005627 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005628 };
5629
5630 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5631 if (!strcmp(core_instance_commands[i].name, name))
5632 return core_instance_commands[i].proc;
5633 }
5634
5635 return nullptr;
5636}
5637
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005638static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005639 static const struct {
5640 const char *name;
5641 PFN_vkVoidFunction proc;
5642 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005643 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5644 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5645 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5646 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5647 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5648 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5649 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5650 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5651 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5652 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5653 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5654 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5655 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5656 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5657 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5658 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5659 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5660 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5661 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5662 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5663 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5664 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5665 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5666 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5667 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5668 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5669 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5670 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5671 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5672 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5673 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5674 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5675 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5676 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5677 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5678 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5679 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5680 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5681 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5682 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5683 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5684 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5685 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5686 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5687 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5688 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5689 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5690 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5691 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5692 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5693 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5694 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5695 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5696 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5697 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5698 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5699 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5700 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5701 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5702 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5703 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5704 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5705 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5706 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5707 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5708 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5709 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5710 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5711 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5712 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5713 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5714 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5715 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5716 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5717 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5718 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5719 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5720 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5721 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5722 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5723 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5724 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5725 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5726 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5727 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5728 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5729 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5730 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5731 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5732 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5733 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5734 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5735 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5736 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5737 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5738 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5739 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5740 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5741 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5742 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5743 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5744 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5745 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5746 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5747 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5748 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5749 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5750 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5751 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5752 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5753 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5754 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5755 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5756 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5757 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5758 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5759 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005760 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5761 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5762 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5763 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005764#ifdef VK_USE_PLATFORM_WIN32_KHR
5765 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5766#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005767};
5768
Chia-I Wuf9b01382016-05-16 07:37:41 +08005769
5770 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5771 if (!strcmp(core_device_commands[i].name, name))
5772 return core_device_commands[i].proc;
5773 }
5774
5775 return nullptr;
5776}
5777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005778static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005779 static const struct {
5780 const char *name;
5781 PFN_vkVoidFunction proc;
5782 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005783 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5784 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5785 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5786 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005787 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005788 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005789 };
5790
5791 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005792 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5793 if (!strcmp(wsi_device_commands[i].name, name))
5794 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005795 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005796 }
5797
5798 return nullptr;
5799}
5800
5801static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5802 static const struct {
5803 const char *name;
5804 PFN_vkVoidFunction proc;
5805 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005806 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5807 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5808 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5809 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5810 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5811 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005812 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005813 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5814 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5815 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5816 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5817 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5818 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5819 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5820 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005821#ifdef VK_USE_PLATFORM_WIN32_KHR
5822 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5823 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5824#endif
5825#ifdef VK_USE_PLATFORM_XCB_KHR
5826 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5827 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5828#endif
5829#ifdef VK_USE_PLATFORM_XLIB_KHR
5830 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5831 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5832#endif
5833#ifdef VK_USE_PLATFORM_MIR_KHR
5834 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5835 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5836#endif
5837#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5838 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5839 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5840#endif
5841#ifdef VK_USE_PLATFORM_ANDROID_KHR
5842 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5843#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005844 };
5845
Chris Forbes8a13e272016-11-02 17:43:34 +13005846 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5847 if (!strcmp(wsi_instance_commands[i].name, name))
5848 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005849 }
5850
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005851 return nullptr;
5852}
5853
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005854} // namespace parameter_validation
5855
5856// vk_layer_logging.h expects these to be defined
5857
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005858VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5859 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5860 const VkAllocationCallbacks *pAllocator,
5861 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005862 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005863}
5864
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005865VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5866 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005867 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005868}
5869
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005870VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5871 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5872 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005873 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005874}
5875
5876// loader-layer interface v0
5877
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005878VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5879 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005880 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005881}
5882
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005883VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5884 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005885 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005886}
5887
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005888VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5889 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005890 // the layer command handles VK_NULL_HANDLE just fine internally
5891 assert(physicalDevice == VK_NULL_HANDLE);
5892 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005893}
5894
5895VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5896 const char *pLayerName, uint32_t *pCount,
5897 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005898 // the layer command handles VK_NULL_HANDLE just fine internally
5899 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005900 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005901}
5902
5903VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005904 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005905}
5906
5907VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005908 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005909}