blob: 7c82fd6d940e44c81c5fc453577c843ca272cba4 [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Chris Forbesb93e59e2016-11-24 14:52:24 +130022 * Author: Chris Forbes <chrisforbes@google.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060023 */
24
Dustin Gravesf8032f22016-05-11 18:31:44 -060025#define NOMINMAX
26
Mike Weiblena4742dc2016-10-31 11:05:56 -060027#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060028#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060029#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32
33#include <iostream>
34#include <string>
35#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050036#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060037#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060038#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060039
Chris Forbesf90cef92016-11-29 09:49:19 +130040#include "vk_loader_platform.h"
41#include "vulkan/vk_layer.h"
42#include "vk_layer_config.h"
Chris Forbes6444bba2016-11-24 14:15:23 +130043#include "vk_dispatch_table_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060044
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060045#include "vk_layer_table.h"
46#include "vk_layer_data.h"
47#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060048#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070049#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060050
Dustin Graves8ffbbf62016-07-22 13:19:46 -060051#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060052#include "parameter_validation.h"
Chris Forbes8976f742017-05-02 14:52:05 -070053#include "device_extensions.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 {
Chris Forbes7b58a712016-11-24 11:35:31 +130074 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070075 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060076 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130077 VkPhysicalDeviceLimits device_limits = {};
78 VkPhysicalDeviceFeatures physical_device_features = {};
79 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Chris Forbes8976f742017-05-02 14:52:05 -070080 DeviceExtensions enables;
Chris Forbese58c9fe2016-11-24 14:44:17 +130081
82 VkLayerDispatchTable dispatch_table = {};
Cody Northrop55443ef2015-09-28 15:09:32 -060083};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050084
Mark Young39389872017-01-19 21:10:49 -070085static uint32_t loader_layer_if_version = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070086static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +130087static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060088
Chris Forbes7b58a712016-11-24 11:35:31 +130089static void init_parameter_validation(instance_layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski739391a2016-03-17 15:08:18 -060090 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060091}
92
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060093VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
94 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
95 const VkAllocationCallbacks *pAllocator,
96 VkDebugReportCallbackEXT *pMsgCallback) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -070097 auto data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +130098 VkResult result = data->dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -060099
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700100 if (result == VK_SUCCESS) {
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600101 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102 }
103
104 return result;
105}
106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600107VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800108 const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700109 auto data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300110 data->dispatch_table.DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
111
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700112 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600113}
114
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600115VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
116 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
117 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700118 auto data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300119 data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700120}
121
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700122static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600123
Chia-I Wu3384db82016-05-16 07:30:58 +0800124static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600125 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800126};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700127
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700128static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600129 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700130 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
131 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
132 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
133 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
134 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 -0700135 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700136 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600137 return false;
138 }
139
140 return true;
141}
142
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700143static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
144 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600145 return "unrecognized enumerator";
146 }
147
148 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700149 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600150 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
151 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600153 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600156 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700158 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600159 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
160 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
163 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600165 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
166 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
169 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700170 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600171 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800180 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800183 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700186 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
187 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188
189 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 enumeratorString += string;
192
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 enumeratorString += '|';
195 }
196 }
197
198 return enumeratorString;
199}
200
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700201static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
202 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
203 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
204 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
205 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
206 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600207 return false;
208 }
209
210 return true;
211}
212
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700213static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
214 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600215 return "unrecognized enumerator";
216 }
217
218 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700219 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600220 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
221 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700222 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600223 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600224 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700225 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600226 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
227 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700228 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600229 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
230 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700231 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
233 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700234 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800235 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600236 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600238 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
239 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600242 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243
244 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 enumeratorString += string;
247
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 enumeratorString += '|';
250 }
251 }
252
253 return enumeratorString;
254}
255
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
257 VkQueueFlagBits allFlags =
258 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
259 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600260 return false;
261 }
262
263 return true;
264}
265
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700266static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
267 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600268 return "unrecognized enumerator";
269 }
270
271 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700272 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800273 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600274 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700275 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600276 strings.push_back("VK_QUEUE_COMPUTE_BIT");
277 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700278 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800279 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600280 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600282 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
283 }
284
285 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600287 enumeratorString += string;
288
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600290 enumeratorString += '|';
291 }
292 }
293
294 return enumeratorString;
295}
296
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700297static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
298 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
299 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
300 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
301 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600302 return false;
303 }
304
305 return true;
306}
307
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700308static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
309 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600310 return "unrecognized enumerator";
311 }
312
313 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600315 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
316 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700317 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800318 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600319 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600321 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
322 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800324 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600325 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800327 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600328 }
329
330 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600332 enumeratorString += string;
333
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600335 enumeratorString += '|';
336 }
337 }
338
339 return enumeratorString;
340}
341
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700342static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700343 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700344 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 return false;
346 }
347
348 return true;
349}
350
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700351static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
352 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600353 return "unrecognized enumerator";
354 }
355
356 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800358 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600359 }
360
361 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700362 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600363 enumeratorString += string;
364
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600366 enumeratorString += '|';
367 }
368 }
369
370 return enumeratorString;
371}
372
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700373static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
374 VkSparseImageFormatFlagBits allFlags =
375 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
376 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
377 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600378 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600379 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600380
381 return true;
382}
383
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700384static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
385 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600386 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600387 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600388
389 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700390 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800391 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600392 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700393 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800394 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600395 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800397 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600398 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600399
400 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700401 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402 enumeratorString += string;
403
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405 enumeratorString += '|';
406 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600407 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600408
409 return enumeratorString;
410}
411
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700412static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700413 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700414 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600415 return false;
416 }
417
418 return true;
419}
420
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
422 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600423 return "unrecognized enumerator";
424 }
425
426 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
429 }
430
431 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700432 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600433 enumeratorString += string;
434
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600436 enumeratorString += '|';
437 }
438 }
439
440 return enumeratorString;
441}
442
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700443static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
444 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
445 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
446 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
447 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
448 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600449 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
450 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
451 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700452 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600453 return false;
454 }
455
456 return true;
457}
458
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700459static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
460 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600461 return "unrecognized enumerator";
462 }
463
464 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700465 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700466 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600467 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700468 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700469 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600470 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700471 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700472 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700475 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700478 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600479 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700481 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600482 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700484 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700486 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700487 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600488 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
498
499 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600501 enumeratorString += string;
502
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600504 enumeratorString += '|';
505 }
506 }
507
508 return enumeratorString;
509}
510
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700511static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
512 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
513 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
514 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515 return false;
516 }
517
518 return true;
519}
520
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700521static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
522 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600523 return "unrecognized enumerator";
524 }
525
526 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700527 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
529 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700530 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600531 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
532 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700533 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600534 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
535 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600537 strings.push_back("VK_QUERY_RESULT_64_BIT");
538 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600539
540 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700541 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600542 enumeratorString += string;
543
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600545 enumeratorString += '|';
546 }
547 }
548
549 return enumeratorString;
550}
551
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700552static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
553 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
554 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
555 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
556 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
557 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600558 return false;
559 }
560
561 return true;
562}
563
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700564static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
565 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600566 return "unrecognized enumerator";
567 }
568
569 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700570 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600571 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
572 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700573 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600574 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
575 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700576 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600577 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
578 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700579 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600580 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
581 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700582 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
584 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700585 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800586 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600587 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600589 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
590 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700591 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800592 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600593 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600595 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
596 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597
598 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 enumeratorString += string;
601
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 enumeratorString += '|';
604 }
605 }
606
607 return enumeratorString;
608}
609
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700610static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
611 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
612 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
613 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614 return false;
615 }
616
617 return true;
618}
619
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700620static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
621 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600622 return "unrecognized enumerator";
623 }
624
625 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700626 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600627 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
628 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700629 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600630 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
631 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700632 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600633 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600634 }
635
636 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700637 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600638 enumeratorString += string;
639
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700640 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600641 enumeratorString += '|';
642 }
643 }
644
645 return enumeratorString;
646}
647
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700648static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
649 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
650 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
651 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
652 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600653 return false;
654 }
655
656 return true;
657}
658
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700659static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
660 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600661 return "unrecognized enumerator";
662 }
663
664 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700665 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600666 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
667 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700668 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600669 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
670 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600672 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
673 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600675 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
676 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600678 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600679 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600680
681 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600683 enumeratorString += string;
684
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686 enumeratorString += '|';
687 }
688 }
689
690 return enumeratorString;
691}
692
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700693static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
694 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
695 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
696 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600697 return false;
698 }
699
700 return true;
701}
702
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700703static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
704 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600705 return "unrecognized enumerator";
706 }
707
708 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700709 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800710 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600711 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700712 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800713 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600714 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700715 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800716 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800719 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 }
721
722 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700723 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600724 enumeratorString += string;
725
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600727 enumeratorString += '|';
728 }
729 }
730
731 return enumeratorString;
732}
733
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700734static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
735 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
736 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
737 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600738 return false;
739 }
740
741 return true;
742}
743
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700744static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
745 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600746 return "unrecognized enumerator";
747 }
748
749 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700750 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600751 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
752 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700753 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600754 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
755 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700756 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600757 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600758 }
759
760 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700761 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600762 enumeratorString += string;
763
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700764 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600765 enumeratorString += '|';
766 }
767 }
768
769 return enumeratorString;
770}
771
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700772static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
773 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
774 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
775 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
776 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600777 return false;
778 }
779
780 return true;
781}
782
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700783static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
784 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600785 return "unrecognized enumerator";
786 }
787
788 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600790 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600791 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600793 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600794 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600796 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
797 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600799 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
800 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700801 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600802 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600803 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700804 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600805 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600808 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600809 }
810
811 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600813 enumeratorString += string;
814
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600816 enumeratorString += '|';
817 }
818 }
819
820 return enumeratorString;
821}
822
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700823static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800824 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700825 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
826 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
827 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
828 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
829 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
830 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 -0700831 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700832 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600833 return false;
834 }
835
836 return true;
837}
838
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700839static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
840 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600841 return "unrecognized enumerator";
842 }
843
844 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700845 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800846 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
847 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800849 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600850 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600852 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600855 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600858 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600859 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700861 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600862 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600864 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700866 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600867 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600868 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600870 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600873 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700882 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600885 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600895 }
896
897 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600899 enumeratorString += string;
900
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600902 enumeratorString += '|';
903 }
904 }
905
906 return enumeratorString;
907}
908
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700909static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800910 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
912 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
913 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
914 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
915 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 +0800916
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700917 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600918 return false;
919 }
920
921 return true;
922}
923
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
925 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600926 return "unrecognized enumerator";
927 }
928
929 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700930 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800931 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600932 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700933 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800934 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600935 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700936 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800937 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600938 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700939 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800940 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600941 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700942 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800943 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600944 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700945 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800946 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600947 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800949 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600950 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800952 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600953 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600980 }
981
982 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600984 enumeratorString += string;
985
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600987 enumeratorString += '|';
988 }
989 }
990
991 return enumeratorString;
992}
993
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700994static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
995 VkCommandPoolCreateFlagBits allFlags =
996 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
997 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600998 return false;
999 }
1000
1001 return true;
1002}
1003
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001004static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1005 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001006 return "unrecognized enumerator";
1007 }
1008
1009 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001010 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001011 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001012 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001013 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001014 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001015 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001016
1017 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001019 enumeratorString += string;
1020
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001021 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001022 enumeratorString += '|';
1023 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001024 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001025
1026 return enumeratorString;
1027}
1028
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001029static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001030 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001031 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001032 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001033 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001034
1035 return true;
1036}
1037
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001038static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1039 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001040 return "unrecognized enumerator";
1041 }
1042
1043 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001045 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001046 }
1047
1048 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001049 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001050 enumeratorString += string;
1051
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001053 enumeratorString += '|';
1054 }
1055 }
1056
1057 return enumeratorString;
1058}
1059
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001060static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1061 VkCommandBufferUsageFlags allFlags =
1062 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1063 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1064 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001065 return false;
1066 }
1067
1068 return true;
1069}
1070
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001071static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1072 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001073 return "unrecognized enumerator";
1074 }
1075
1076 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001077 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001078 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001079 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001080 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001081 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001082 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001085 }
1086
1087 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001088 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 enumeratorString += string;
1090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 enumeratorString += '|';
1093 }
1094 }
1095
1096 return enumeratorString;
1097}
1098
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001099static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001100 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001101 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001102 return false;
1103 }
1104
1105 return true;
1106}
1107
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1109 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001110 return "unrecognized enumerator";
1111 }
1112
1113 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001115 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001116 }
1117
1118 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001120 enumeratorString += string;
1121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001123 enumeratorString += '|';
1124 }
1125 }
1126
1127 return enumeratorString;
1128}
1129
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001130static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1131 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1132 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1133 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001134 return false;
1135 }
1136
1137 return true;
1138}
1139
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001140static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1141 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001142 return "unrecognized enumerator";
1143 }
1144
1145 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001146 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001147 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1148 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001149 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001150 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1151 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001152 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001153 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001156 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1157 }
1158
1159 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001160 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001161 enumeratorString += string;
1162
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001164 enumeratorString += '|';
1165 }
1166 }
1167
1168 return enumeratorString;
1169}
1170
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001171static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001172 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001173 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001174 return false;
1175 }
1176
1177 return true;
1178}
1179
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001180static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1181 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001182 return "unrecognized enumerator";
1183 }
1184
1185 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001187 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001188 }
1189
1190 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001191 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001192 enumeratorString += string;
1193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001195 enumeratorString += '|';
1196 }
1197 }
1198
1199 return enumeratorString;
1200}
1201
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001202static const int MaxParamCheckerStringLength = 256;
1203
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001204static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001205 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001206 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001207 assert(validateString != nullptr);
1208
Chris Forbes04b61da2016-11-03 09:53:59 +13001209 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001210
1211 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1212
1213 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001214 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001215 } else if (result & VK_STRING_ERROR_LENGTH) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001216 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001217 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1218 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001219 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001220 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001221 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1222 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001223 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001224 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001225}
1226
Dustin Gravesde628532016-04-21 16:30:17 -06001227static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1228 uint32_t index) {
1229 assert(device_data != nullptr);
1230 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001231 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001232
1233 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06001234 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1235 LayerName, "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001236 } else {
1237 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1238 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06001239 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1240 LayerName,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001241 "%s: %s (%d) must be one of the indices specified when the device was created, via "
1242 "the VkDeviceQueueCreateInfo structure.",
1243 function_name, parameter_name, index);
Dustin Gravesde628532016-04-21 16:30:17 -06001244 return false;
1245 }
1246 }
1247
Chris Forbes04b61da2016-11-03 09:53:59 +13001248 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001249}
1250
1251static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1252 const uint32_t count, const uint32_t *indices) {
1253 assert(device_data != nullptr);
1254 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001255 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001256
1257 if (indices != nullptr) {
1258 for (uint32_t i = 0; i < count; i++) {
1259 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06001260 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001261 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001262 } else {
1263 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1264 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06001265 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1266 __LINE__, 1, LayerName,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001267 "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1268 "created, via the VkDeviceQueueCreateInfo structure.",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001269 function_name, parameter_name, i, indices[i]);
Dustin Gravesde628532016-04-21 16:30:17 -06001270 return false;
1271 }
1272 }
1273 }
1274 }
1275
Chris Forbes04b61da2016-11-03 09:53:59 +13001276 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001277}
1278
Chris Forbes6be763e2016-11-24 12:42:33 +13001279static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001280
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001281VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1282 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001283 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001284
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001285 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001286 assert(chain_info != nullptr);
1287 assert(chain_info->u.pLayerInfo != nullptr);
1288
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001289 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1290 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001291 if (fpCreateInstance == NULL) {
1292 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001293 }
1294
Dustin Graves842621d2016-03-03 14:17:08 -07001295 // Advance the link info for the next element on the chain
1296 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1297
1298 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001299
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001300 if (result == VK_SUCCESS) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001301 auto my_instance_data = GetLayerDataPtr(get_dispatch_key(*pInstance), instance_layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001302 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001303
Chris Forbes6444bba2016-11-24 14:15:23 +13001304 layer_init_instance_dispatch_table(*pInstance, &my_instance_data->dispatch_table, fpGetInstanceProcAddr);
Chia-I Wua570b7c2016-05-16 07:48:14 +08001305 my_instance_data->instance = *pInstance;
Chris Forbes6444bba2016-11-24 14:15:23 +13001306 my_instance_data->report_data =
1307 debug_report_create_instance(&my_instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount,
1308 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001309
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001310 // Look for one or more debug report create info structures
1311 // and setup a callback(s) for each one found.
1312 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1313 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1314 if (my_instance_data->num_tmp_callbacks > 0) {
1315 // Setup the temporary callback(s) here to catch early issues:
1316 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1317 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1318 // Failure of setting up one or more of the callback.
1319 // Therefore, clean up and don't use those callbacks:
1320 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1321 my_instance_data->num_tmp_callbacks = 0;
1322 }
1323 }
1324 }
1325
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001326 init_parameter_validation(my_instance_data, pAllocator);
Chris Forbes6be763e2016-11-24 12:42:33 +13001327 CheckInstanceRegisterExtensions(pCreateInfo, my_instance_data);
Dustin Graves842621d2016-03-03 14:17:08 -07001328
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001329 // Ordinarily we'd check these before calling down the chain, but none of the layer
1330 // support is in place until now, if we survive we can report the issue now.
1331 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001332
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001333 if (pCreateInfo->pApplicationInfo) {
1334 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1335 validate_string(my_instance_data->report_data, "vkCreateInstance",
1336 "pCreateInfo->VkApplicationInfo->pApplicationName",
1337 pCreateInfo->pApplicationInfo->pApplicationName);
1338 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001339
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001340 if (pCreateInfo->pApplicationInfo->pEngineName) {
1341 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1342 pCreateInfo->pApplicationInfo->pEngineName);
1343 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001344 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001345
1346 // Disable the tmp callbacks:
1347 if (my_instance_data->num_tmp_callbacks > 0) {
1348 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1349 my_instance_data->tmp_callbacks);
1350 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001351 }
1352
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001353 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001354}
1355
Chia-I Wu01ca2372016-05-13 14:37:49 +08001356VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001357 // Grab the key before the instance is destroyed.
1358 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001359 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001360 auto my_data = GetLayerDataPtr(key, instance_layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001361 assert(my_data != NULL);
1362
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001363 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1364 bool callback_setup = false;
1365 if (my_data->num_tmp_callbacks > 0) {
1366 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1367 my_data->tmp_callbacks)) {
1368 callback_setup = true;
1369 }
1370 }
1371
Chris Forbes04b61da2016-11-03 09:53:59 +13001372 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001373
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001374 // Disable and cleanup the temporary callback(s):
1375 if (callback_setup) {
1376 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1377 }
1378 if (my_data->num_tmp_callbacks > 0) {
1379 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1380 my_data->num_tmp_callbacks = 0;
1381 }
1382
Chris Forbes04b61da2016-11-03 09:53:59 +13001383 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001384 my_data->dispatch_table.DestroyInstance(instance, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001385
1386 // Clean up logging callback, if any
1387 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001388 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1389 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001390 my_data->logging_callback.pop_back();
1391 }
1392
Chris Forbes78a56b02016-11-02 16:13:01 +13001393 layer_debug_report_destroy_instance(my_data->report_data);
Chris Forbes6444bba2016-11-24 14:15:23 +13001394 instance_layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001395 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001396}
1397
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001398VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1399 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001400 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001401 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001402 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001403 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001404
Chris Forbes04b61da2016-11-03 09:53:59 +13001405 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001406
Chris Forbes04b61da2016-11-03 09:53:59 +13001407 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001408 result = my_data->dispatch_table.EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001409 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001410 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001411 return result;
1412}
1413
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001414VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001415 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001416 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001417 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001418
Chris Forbes04b61da2016-11-03 09:53:59 +13001419 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001420
Chris Forbes04b61da2016-11-03 09:53:59 +13001421 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001422 my_data->dispatch_table.GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001423 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001424}
1425
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001426VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1427 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001428 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001429 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001430 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001431
Chris Forbes04b61da2016-11-03 09:53:59 +13001432 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433
Chris Forbes04b61da2016-11-03 09:53:59 +13001434 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001435 my_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001436 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001437}
1438
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001439VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1440 VkImageType type, VkImageTiling tiling,
1441 VkImageUsageFlags usage, VkImageCreateFlags flags,
1442 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001443 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001444 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001445 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001446 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001447
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001448 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
1449 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450
Chris Forbes04b61da2016-11-03 09:53:59 +13001451 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001452 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1453 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001455 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001456 }
Chia-I Wu17241042015-10-31 00:31:16 +08001457
1458 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001459}
1460
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001461VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001462 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001463 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001465
Chris Forbes04b61da2016-11-03 09:53:59 +13001466 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001467
Chris Forbes04b61da2016-11-03 09:53:59 +13001468 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001469 my_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001470 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001471}
1472
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001473VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1474 uint32_t *pQueueFamilyPropertyCount,
1475 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001476 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001477 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001478 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001479
Chris Forbes04b61da2016-11-03 09:53:59 +13001480 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001481 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001482
Chris Forbes04b61da2016-11-03 09:53:59 +13001483 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001484 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount,
1485 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001486 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001487}
1488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001489VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1490 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001491 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001492 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001494
Chris Forbes04b61da2016-11-03 09:53:59 +13001495 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496
Chris Forbes04b61da2016-11-03 09:53:59 +13001497 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001498 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001499 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001500}
1501
Mike Weiblen37166272017-01-05 15:11:00 -07001502static void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001503 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001504 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001505
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001506 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes0e0161a2016-11-02 16:21:28 +13001507
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001508 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1509 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1510 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001511 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07001512 VALIDATION_ERROR_00035, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001513 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
Mike Weiblena6666382017-01-05 15:16:11 -07001514 "structure. %s",
1515 i, validation_error_map[VALIDATION_ERROR_00035]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001516 } else {
1517 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001518 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001519
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001520 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1521 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1522 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1523 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001524 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 -06001525 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001526 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1527 "between 0 and 1. Actual value is %f",
1528 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1529 }
1530 }
1531 }
1532
1533 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1534 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001535 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 -06001536 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001537 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1538 "of queue families.",
1539 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001540 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1541 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1542 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001543 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 -06001544 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001545 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1546 "queues for the given family index.",
1547 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001548 }
Michael Lentine774704f2016-01-27 13:36:46 -06001549 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001550 }
1551}
1552
Chris Forbes6be763e2016-11-24 12:42:33 +13001553static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001554 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001555 auto name = pCreateInfo->ppEnabledExtensionNames[i];
1556
1557 if (strcmp(name, VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1558 instance_data->extensions.surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001559#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Young39389872017-01-19 21:10:49 -07001560 } else if (strcmp(name, VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001561 instance_data->extensions.xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001562#endif
1563#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Young39389872017-01-19 21:10:49 -07001564 } else if (strcmp(name, VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001565 instance_data->extensions.xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001566#endif
1567#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Young39389872017-01-19 21:10:49 -07001568 } else if (strcmp(name, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001569 instance_data->extensions.wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001570#endif
1571#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Young39389872017-01-19 21:10:49 -07001572 } else if (strcmp(name, VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001573 instance_data->extensions.mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001574#endif
1575#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Young39389872017-01-19 21:10:49 -07001576 } else if (strcmp(name, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001577 instance_data->extensions.android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001578#endif
1579#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Young39389872017-01-19 21:10:49 -07001580 } else if (strcmp(name, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001581 instance_data->extensions.win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001582#endif
Mark Young39389872017-01-19 21:10:49 -07001583 } else if (strcmp(name, VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001584 instance_data->extensions.display_enabled = true;
Mark Young39389872017-01-19 21:10:49 -07001585 } else if (strcmp(name, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) {
1586 instance_data->extensions.khr_get_phys_dev_properties2_enabled = true;
Mark Young0f183a82017-02-28 09:58:04 -07001587 } else if (strcmp(name, VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME) == 0) {
1588 instance_data->extensions.khx_device_group_creation_enabled = true;
1589 } else if (strcmp(name, VK_KHX_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) == 0) {
1590 instance_data->extensions.khx_external_memory_capabilities_enabled = true;
1591 } else if (strcmp(name, VK_KHX_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME) == 0) {
1592 instance_data->extensions.khx_external_semaphore_capabilities_enabled = true;
Mark Young39389872017-01-19 21:10:49 -07001593 } else if (strcmp(name, VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) == 0) {
1594 instance_data->extensions.nv_external_memory_capabilities_enabled = true;
1595#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
1596 } else if (strcmp(name, VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME) == 0) {
1597 instance_data->extensions.ext_acquire_xlib_display_enabled = true;
1598#endif
1599 } else if (strcmp(name, VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME) == 0) {
1600 instance_data->extensions.ext_direct_mode_display_enabled = true;
1601 } else if (strcmp(name, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME) == 0) {
1602 instance_data->extensions.ext_display_surface_counter_enabled = true;
1603 } else if (strcmp(name, VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) == 0) {
1604 instance_data->extensions.nv_external_memory_capabilities_enabled = true;
Chris Forbes2e47f432016-11-03 10:18:18 +13001605 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001606 }
1607}
1608
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001609void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001610 layer_data *my_device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001611
1612 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1613 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1614 my_device_data->queueFamilyIndexMap.insert(
1615 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1616 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001617 }
1618}
1619
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001620VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001621 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001622 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001623 * NOTE: We do not validate physicalDevice or any dispatchable
1624 * object as the first parameter. We couldn't get here if it was wrong!
1625 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001626
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001627 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001628 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001629 auto my_instance_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001630 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001631
Chris Forbes04b61da2016-11-03 09:53:59 +13001632 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001633
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001634 if (pCreateInfo != NULL) {
1635 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001636 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001637 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001638 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001639 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001640 }
Michael Lentine774704f2016-01-27 13:36:46 -06001641
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001642 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001643 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001644 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1645 pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001646 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001647 }
Tobin Ehlis3da63962017-02-06 16:44:50 -07001648 if (pCreateInfo->pNext != NULL && pCreateInfo->pEnabledFeatures) {
1649 // Check for get_physical_device_properties2 struct
1650 struct std_header {
1651 VkStructureType sType;
1652 const void *pNext;
1653 };
1654 std_header *cur_pnext = (std_header *)pCreateInfo->pNext;
1655 while (cur_pnext) {
1656 if (VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR == cur_pnext->sType) {
1657 // Cannot include VkPhysicalDeviceFeatures2KHR and have non-null pEnabledFeatures
1658 skip |= log_msg(my_instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
1659 VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE, LayerName,
1660 "VkDeviceCreateInfo->pNext includes a VkPhysicalDeviceFeatures2KHR struct when "
1661 "pCreateInfo->pEnabledFeatures is non-NULL.");
1662 break;
1663 }
1664 cur_pnext = (std_header *)cur_pnext->pNext;
1665 }
1666 }
Mark Young0f183a82017-02-28 09:58:04 -07001667 if (pCreateInfo->pNext != NULL && pCreateInfo->pEnabledFeatures) {
1668 // Check for get_physical_device_properties2 struct
1669 struct std_header {
1670 VkStructureType sType;
1671 const void *pNext;
1672 };
1673 std_header *cur_pnext = (std_header *)pCreateInfo->pNext;
1674 while (cur_pnext) {
1675 if (VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR == cur_pnext->sType) {
1676 // Cannot include VkPhysicalDeviceFeatures2KHR and have non-null pEnabledFeatures
1677 skip |= log_msg(my_instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
1678 VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE, LayerName,
1679 "VkDeviceCreateInfo->pNext includes a VkPhysicalDeviceFeatures2KHR struct when "
1680 "pCreateInfo->pEnabledFeatures is non-NULL.");
1681 break;
1682 }
1683 cur_pnext = (std_header *)cur_pnext->pNext;
1684 }
1685 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001686 }
1687
Chris Forbes04b61da2016-11-03 09:53:59 +13001688 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001689 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001690 assert(chain_info != nullptr);
1691 assert(chain_info->u.pLayerInfo != nullptr);
1692
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001693 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1694 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001695 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001696 if (fpCreateDevice == NULL) {
1697 return VK_ERROR_INITIALIZATION_FAILED;
1698 }
1699
1700 // Advance the link info for the next element on the chain
1701 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1702
1703 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001704
1705 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1706
1707 if (result == VK_SUCCESS) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001708 layer_data *my_device_data = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001709 assert(my_device_data != nullptr);
1710
1711 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Chris Forbese58c9fe2016-11-24 14:44:17 +13001712 layer_init_device_dispatch_table(*pDevice, &my_device_data->dispatch_table, fpGetDeviceProcAddr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001713
Chris Forbes8976f742017-05-02 14:52:05 -07001714 my_device_data->enables.InitFromDeviceCreateInfo(pCreateInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001715
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001716 uint32_t count;
Chris Forbes6444bba2016-11-24 14:15:23 +13001717 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001718 std::vector<VkQueueFamilyProperties> properties(count);
Chris Forbes6444bba2016-11-24 14:15:23 +13001719 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001720
1721 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1722 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001723
1724 // Query and save physical device limits for this device
1725 VkPhysicalDeviceProperties device_properties = {};
Chris Forbes6444bba2016-11-24 14:15:23 +13001726 my_instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &device_properties);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001727 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001728 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001729
1730 // Save app-enabled features in this device's layer_data structure
1731 if (pCreateInfo->pEnabledFeatures) {
1732 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1733 } else {
1734 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1735 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001736 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001737 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001738
Jeremy Hayes99a96322015-06-26 12:48:09 -06001739 return result;
1740}
1741
Chia-I Wu01ca2372016-05-13 14:37:49 +08001742VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001743 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001744 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001745 layer_data *my_data = GetLayerDataPtr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001746 assert(my_data != NULL);
1747
Chris Forbes04b61da2016-11-03 09:53:59 +13001748 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001749
Chris Forbes04b61da2016-11-03 09:53:59 +13001750 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001751 layer_debug_report_destroy_device(device);
1752
Jeremy Hayes99a96322015-06-26 12:48:09 -06001753#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001754 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001755#endif
1756
Chris Forbese58c9fe2016-11-24 14:44:17 +13001757 my_data->dispatch_table.DestroyDevice(device, pAllocator);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001758 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001759 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001760}
1761
Mike Weiblen37166272017-01-05 15:11:00 -07001762static bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001763 layer_data *my_device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001764 assert(my_device_data != nullptr);
1765
Dustin Gravesde628532016-04-21 16:30:17 -06001766 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001767
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001768 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001769 if (queue_data->second <= queueIndex) {
Mike Weiblena6666382017-01-05 15:16:11 -07001770 log_msg(
1771 my_device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1772 VALIDATION_ERROR_00061, LayerName,
1773 "vkGetDeviceQueue() parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1774 "was created. %s",
1775 queueIndex, validation_error_map[VALIDATION_ERROR_00061]);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001776 return false;
1777 }
1778 return true;
1779}
1780
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001781VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001782 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001783 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001784 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001785
Chris Forbes04b61da2016-11-03 09:53:59 +13001786 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001787
Chris Forbes04b61da2016-11-03 09:53:59 +13001788 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1790
Chris Forbese58c9fe2016-11-24 14:44:17 +13001791 my_data->dispatch_table.GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001792 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001793}
1794
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001795VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001796 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001797 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001798 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001799 assert(my_data != NULL);
1800
Chris Forbes04b61da2016-11-03 09:53:59 +13001801 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001802
Chris Forbes04b61da2016-11-03 09:53:59 +13001803 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001804 result = my_data->dispatch_table.QueueSubmit(queue, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001805
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001806 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001807 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001808
Jeremy Hayes99a96322015-06-26 12:48:09 -06001809 return result;
1810}
1811
Chia-I Wu01ca2372016-05-13 14:37:49 +08001812VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001813 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001814 assert(my_data != NULL);
1815
Chris Forbese58c9fe2016-11-24 14:44:17 +13001816 VkResult result = my_data->dispatch_table.QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001818 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001819
1820 return result;
1821}
1822
Chia-I Wu01ca2372016-05-13 14:37:49 +08001823VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001824 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001825 assert(my_data != NULL);
1826
Chris Forbese58c9fe2016-11-24 14:44:17 +13001827 VkResult result = my_data->dispatch_table.DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001828
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001829 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001830
1831 return result;
1832}
1833
Chia-I Wu01ca2372016-05-13 14:37:49 +08001834VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001835 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001836 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001837 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001838 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001839 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001840
Chris Forbes04b61da2016-11-03 09:53:59 +13001841 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001842
Chris Forbes04b61da2016-11-03 09:53:59 +13001843 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001844 result = my_data->dispatch_table.AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001845
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001846 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001848
1849 return result;
1850}
1851
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001852VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001853 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001854 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001855 assert(my_data != NULL);
1856
Chris Forbes04b61da2016-11-03 09:53:59 +13001857 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001858
Chris Forbes04b61da2016-11-03 09:53:59 +13001859 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001860 my_data->dispatch_table.FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001861 }
1862}
1863
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001864VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1865 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001866 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001867 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001868 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001869 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001870
Chris Forbes04b61da2016-11-03 09:53:59 +13001871 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872
Chris Forbes04b61da2016-11-03 09:53:59 +13001873 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001874 result = my_data->dispatch_table.MapMemory(device, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001875
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001876 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001878
1879 return result;
1880}
1881
Chia-I Wu01ca2372016-05-13 14:37:49 +08001882VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001883 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001884 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001885 assert(my_data != NULL);
1886
Chris Forbes04b61da2016-11-03 09:53:59 +13001887 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001888
Chris Forbes04b61da2016-11-03 09:53:59 +13001889 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001890 my_data->dispatch_table.UnmapMemory(device, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001891 }
1892}
1893
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001894VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1895 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001896 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001897 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001898 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001900
Chris Forbes04b61da2016-11-03 09:53:59 +13001901 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001902
Chris Forbes04b61da2016-11-03 09:53:59 +13001903 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001904 result = my_data->dispatch_table.FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001905
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001906 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001908
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001909 return result;
1910}
1911
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001912VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1913 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001914 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001915 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001916 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001918
Chris Forbes04b61da2016-11-03 09:53:59 +13001919 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001920
Chris Forbes04b61da2016-11-03 09:53:59 +13001921 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001922 result = my_data->dispatch_table.InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001923
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001924 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001925 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001926
Tony Barbourb1250542015-04-16 19:23:13 -06001927 return result;
1928}
1929
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001930VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1931 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001932 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001933 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001934 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001935
Chris Forbes04b61da2016-11-03 09:53:59 +13001936 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001937
Chris Forbes04b61da2016-11-03 09:53:59 +13001938 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001939 my_data->dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001940 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001941}
1942
Chia-I Wu01ca2372016-05-13 14:37:49 +08001943VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1944 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001945 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001946 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001947 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001948 assert(my_data != NULL);
1949
Chris Forbes04b61da2016-11-03 09:53:59 +13001950 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001951
Chris Forbes04b61da2016-11-03 09:53:59 +13001952 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001953 result = my_data->dispatch_table.BindBufferMemory(device, buffer, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001954
1955 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1956 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001957
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001958 return result;
1959}
1960
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001961VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001962 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001963 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001964 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001965 assert(my_data != NULL);
1966
Chris Forbes04b61da2016-11-03 09:53:59 +13001967 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001968
Chris Forbes04b61da2016-11-03 09:53:59 +13001969 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001970 result = my_data->dispatch_table.BindImageMemory(device, image, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001971
1972 validate_result(my_data->report_data, "vkBindImageMemory", result);
1973 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001974
1975 return result;
1976}
1977
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001978VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1979 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001980 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001981 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001983
Chris Forbes04b61da2016-11-03 09:53:59 +13001984 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001985
Chris Forbes04b61da2016-11-03 09:53:59 +13001986 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001987 my_data->dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001988 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001989}
1990
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001991VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001992 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001993 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001994 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001995
Chris Forbes04b61da2016-11-03 09:53:59 +13001996 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001997
Chris Forbes04b61da2016-11-03 09:53:59 +13001998 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001999 my_data->dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002000 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002001}
2002
Mike Weiblen37166272017-01-05 15:11:00 -07002003static bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002004 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002005 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002007 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002008 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2009 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002010 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 -06002011 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002012 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2013 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002014 return false;
2015 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002016 }
2017
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002018 return true;
2019}
2020
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002021VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2022 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002023 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002024 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002025 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002026
Chris Forbes04b61da2016-11-03 09:53:59 +13002027 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002028 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002029
Chris Forbes04b61da2016-11-03 09:53:59 +13002030 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002031 my_data->dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount,
2032 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002033
2034 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2035 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002036}
2037
Mike Weiblen37166272017-01-05 15:11:00 -07002038static bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002039 VkSampleCountFlagBits samples, VkImageUsageFlags usage,
2040 VkImageTiling tiling, uint32_t *pNumProperties,
2041 VkSparseImageFormatProperties *pProperties) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002042 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002043 if (pProperties != nullptr) {
2044 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2045 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002046 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 -06002047 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002048 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2049 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002050 return false;
2051 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002052 }
2053
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002054 return true;
2055}
2056
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002057VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2058 VkImageType type, VkSampleCountFlagBits samples,
2059 VkImageUsageFlags usage, VkImageTiling tiling,
2060 uint32_t *pPropertyCount,
2061 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002062 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002063 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002064 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002065
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002066 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
2067 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002068
Chris Forbes04b61da2016-11-03 09:53:59 +13002069 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13002070 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling,
2071 pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002072
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002073 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2074 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002075 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002076}
2077
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002078VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2079 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002080 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002081 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002082 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002083 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002084
Chris Forbes04b61da2016-11-03 09:53:59 +13002085 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002086
Chris Forbes04b61da2016-11-03 09:53:59 +13002087 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002088 result = my_data->dispatch_table.QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002089
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002090 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002091 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002092
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002093 return result;
2094}
2095
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002096VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2097 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002098 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002099 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002100 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002101 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002102
Chris Forbes04b61da2016-11-03 09:53:59 +13002103 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002104
Chris Forbes04b61da2016-11-03 09:53:59 +13002105 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002106 result = my_data->dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002107
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002108 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002109 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002110
2111 return result;
2112}
2113
Chia-I Wu01ca2372016-05-13 14:37:49 +08002114VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002115 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002116 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002117 assert(my_data != NULL);
2118
Chris Forbes04b61da2016-11-03 09:53:59 +13002119 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002120
Chris Forbes04b61da2016-11-03 09:53:59 +13002121 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002122 my_data->dispatch_table.DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002123 }
2124}
2125
Chia-I Wu01ca2372016-05-13 14:37:49 +08002126VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002127 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002128 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002129 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002130 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002131
Chris Forbes04b61da2016-11-03 09:53:59 +13002132 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002133
Chris Forbes04b61da2016-11-03 09:53:59 +13002134 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002135 result = my_data->dispatch_table.ResetFences(device, fenceCount, pFences);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002136
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002137 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002138 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002139
2140 return result;
2141}
2142
Chia-I Wu01ca2372016-05-13 14:37:49 +08002143VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002144 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002145 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002146 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002147 assert(my_data != NULL);
2148
Chris Forbes04b61da2016-11-03 09:53:59 +13002149 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002150
Chris Forbes04b61da2016-11-03 09:53:59 +13002151 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002152 result = my_data->dispatch_table.GetFenceStatus(device, fence);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002153
2154 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2155 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002156
2157 return result;
2158}
2159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002160VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2161 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002162 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002163 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002164 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002165 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002166
Chris Forbes04b61da2016-11-03 09:53:59 +13002167 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002168
Chris Forbes04b61da2016-11-03 09:53:59 +13002169 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002170 result = my_data->dispatch_table.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002171
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002172 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002173 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002174
2175 return result;
2176}
2177
Chia-I Wu01ca2372016-05-13 14:37:49 +08002178VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002179 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002180 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002181 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002182 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002183 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002184
Chris Forbes04b61da2016-11-03 09:53:59 +13002185 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002186
Chris Forbes04b61da2016-11-03 09:53:59 +13002187 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002188 result = my_data->dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002189
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002190 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002191 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002192
2193 return result;
2194}
2195
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002196VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002197 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002198 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002199 assert(my_data != NULL);
2200
Chris Forbes04b61da2016-11-03 09:53:59 +13002201 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002202
Chris Forbes04b61da2016-11-03 09:53:59 +13002203 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002204 my_data->dispatch_table.DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002205 }
2206}
2207
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002208VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2209 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002210 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002211 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002212 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002213 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002214
Chris Forbes04b61da2016-11-03 09:53:59 +13002215 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002216
Chris Forbes04b61da2016-11-03 09:53:59 +13002217 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002218 result = my_data->dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002219
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002220 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002221 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002222
2223 return result;
2224}
2225
Chia-I Wu01ca2372016-05-13 14:37:49 +08002226VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002227 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002228 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002229 assert(my_data != NULL);
2230
Chris Forbes04b61da2016-11-03 09:53:59 +13002231 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002232
Chris Forbes04b61da2016-11-03 09:53:59 +13002233 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002234 my_data->dispatch_table.DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002235 }
2236}
2237
Chia-I Wu01ca2372016-05-13 14:37:49 +08002238VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002239 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002240 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002241 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002242 assert(my_data != NULL);
2243
Chris Forbes04b61da2016-11-03 09:53:59 +13002244 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002245
Chris Forbes04b61da2016-11-03 09:53:59 +13002246 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002247 result = my_data->dispatch_table.GetEventStatus(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002248
2249 validate_result(my_data->report_data, "vkGetEventStatus", result);
2250 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002251
2252 return result;
2253}
2254
Chia-I Wu01ca2372016-05-13 14:37:49 +08002255VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002256 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002257 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002258 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002259 assert(my_data != NULL);
2260
Chris Forbes04b61da2016-11-03 09:53:59 +13002261 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002262
Chris Forbes04b61da2016-11-03 09:53:59 +13002263 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002264 result = my_data->dispatch_table.SetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002265
2266 validate_result(my_data->report_data, "vkSetEvent", result);
2267 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002268
2269 return result;
2270}
2271
Chia-I Wu01ca2372016-05-13 14:37:49 +08002272VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002273 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002274 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002275 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002276 assert(my_data != NULL);
2277
Chris Forbes04b61da2016-11-03 09:53:59 +13002278 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002279
Chris Forbes04b61da2016-11-03 09:53:59 +13002280 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002281 result = my_data->dispatch_table.ResetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002282
2283 validate_result(my_data->report_data, "vkResetEvent", result);
2284 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002285
2286 return result;
2287}
2288
Chia-I Wu01ca2372016-05-13 14:37:49 +08002289VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002290 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002291 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002292 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002293 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002294 assert(device_data != nullptr);
2295 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002296
Chris Forbes04b61da2016-11-03 09:53:59 +13002297 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002298
Dustin Gravesc900f572016-05-16 11:07:59 -06002299 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2300 if (pCreateInfo != nullptr) {
2301 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2302 // VkQueryPipelineStatisticFlagBits values
2303 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2304 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Mike Weiblena6666382017-01-05 15:16:11 -07002305 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2306 VALIDATION_ERROR_01007, LayerName,
2307 "vkCreateQueryPool(): if pCreateInfo->queryType is "
2308 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2309 "a valid combination of VkQueryPipelineStatisticFlagBits values. %s",
2310 validation_error_map[VALIDATION_ERROR_01007]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002311 }
2312 }
2313
Chris Forbes04b61da2016-11-03 09:53:59 +13002314 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002315 result = device_data->dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316
Dustin Gravesc900f572016-05-16 11:07:59 -06002317 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002318 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002319
2320 return result;
2321}
2322
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002323VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002324 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002325 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002326 assert(my_data != NULL);
2327
Chris Forbes04b61da2016-11-03 09:53:59 +13002328 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002329
Chris Forbes04b61da2016-11-03 09:53:59 +13002330 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002331 my_data->dispatch_table.DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002332 }
2333}
2334
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002335VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2336 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002337 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002338 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002339 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002340 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002341
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002342 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData,
2343 stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002344
Chris Forbes04b61da2016-11-03 09:53:59 +13002345 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002346 result =
2347 my_data->dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002349 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002350 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002351
2352 return result;
2353}
2354
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002355VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2356 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002357 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002358 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002359 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002360 assert(device_data != nullptr);
2361 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002362
Chris Forbes04b61da2016-11-03 09:53:59 +13002363 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002364
Dustin Gravesc900f572016-05-16 11:07:59 -06002365 if (pCreateInfo != nullptr) {
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002366 // Buffer size must be greater than 0 (error 00663)
2367 skip |=
2368 ValidateGreaterThan(report_data, "vkCreateBuffer", "pCreateInfo->size", static_cast<uint32_t>(pCreateInfo->size), 0u);
2369
Dustin Gravesc900f572016-05-16 11:07:59 -06002370 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2371 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2372 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2373 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002374 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2375 VALIDATION_ERROR_00665, LayerName,
2376 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2377 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2378 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002379 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002380
Dustin Gravesc900f572016-05-16 11:07:59 -06002381 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2382 // queueFamilyIndexCount uint32_t values
2383 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002384 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2385 VALIDATION_ERROR_00664, LayerName,
2386 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2387 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2388 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2389 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002390 }
2391
2392 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002393 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002394 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
Dustin Gravesc900f572016-05-16 11:07:59 -06002395 }
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002396
2397 // If flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain
2398 // VK_BUFFER_CREATE_SPARSE_BINDING_BIT
2399 if (((pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2400 ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) != VK_BUFFER_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski181ec3a2016-12-14 13:37:04 -07002401 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2402 VALIDATION_ERROR_00669, LayerName,
2403 "vkCreateBuffer: if pCreateInfo->flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or "
2404 "VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT. %s",
2405 validation_error_map[VALIDATION_ERROR_00669]);
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002406 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002407 }
2408
Chris Forbes04b61da2016-11-03 09:53:59 +13002409 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002410 result = device_data->dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002411
Dustin Gravesc900f572016-05-16 11:07:59 -06002412 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002414
2415 return result;
2416}
2417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002418VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002419 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002420 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002421 assert(my_data != NULL);
2422
Chris Forbes04b61da2016-11-03 09:53:59 +13002423 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002424
Chris Forbes04b61da2016-11-03 09:53:59 +13002425 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002426 my_data->dispatch_table.DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002427 }
2428}
2429
Chia-I Wu01ca2372016-05-13 14:37:49 +08002430VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2431 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002432 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002433 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002434 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002435 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002436
Chris Forbes04b61da2016-11-03 09:53:59 +13002437 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002438
Chris Forbes04b61da2016-11-03 09:53:59 +13002439 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002440 result = my_data->dispatch_table.CreateBufferView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002441
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002442 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002443 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002444
2445 return result;
2446}
2447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002448VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002449 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002450 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002451 assert(my_data != NULL);
2452
Chris Forbes04b61da2016-11-03 09:53:59 +13002453 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002454
Chris Forbes04b61da2016-11-03 09:53:59 +13002455 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002456 my_data->dispatch_table.DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002457 }
2458}
2459
Chia-I Wu01ca2372016-05-13 14:37:49 +08002460VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2461 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002462 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002463 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002464 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002465 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002466 debug_report_data *report_data = device_data->report_data;
2467
Chris Forbes04b61da2016-11-03 09:53:59 +13002468 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002469
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002470 if (pCreateInfo != nullptr) {
Mark Lobodzinski7d9ef882017-03-01 16:15:02 -07002471
2472 if ((device_data->physical_device_features.textureCompressionETC2 == false) &&
Dave Houlton1d2022c2017-03-29 11:43:58 -06002473 FormatIsCompressed_ETC2_EAC(pCreateInfo->format)) {
Mark Lobodzinski7d9ef882017-03-01 16:15:02 -07002474 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2475 DEVICE_FEATURE, LayerName,
2476 "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionETC2 feature is "
2477 "not enabled: neither ETC2 nor EAC formats can be used to create images.",
2478 string_VkFormat(pCreateInfo->format));
2479 }
2480
Mark Lobodzinski846c2142017-03-01 16:17:39 -07002481 if ((device_data->physical_device_features.textureCompressionASTC_LDR == false) &&
Dave Houlton1d2022c2017-03-29 11:43:58 -06002482 FormatIsCompressed_ASTC_LDR(pCreateInfo->format)) {
Mark Lobodzinski846c2142017-03-01 16:17:39 -07002483 skip |=
2484 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2485 DEVICE_FEATURE, LayerName,
2486 "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionASTC_LDR feature is "
2487 "not enabled: ASTC formats cannot be used to create images.",
2488 string_VkFormat(pCreateInfo->format));
2489 }
2490
Mark Lobodzinski64f374e2017-03-01 16:19:36 -07002491 if ((device_data->physical_device_features.textureCompressionBC == false) &&
Dave Houlton1d2022c2017-03-29 11:43:58 -06002492 FormatIsCompressed_BC(pCreateInfo->format)) {
Mark Lobodzinski64f374e2017-03-01 16:19:36 -07002493 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2494 DEVICE_FEATURE, LayerName,
2495 "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionBC feature is "
2496 "not enabled: BC compressed formats cannot be used to create images.",
2497 string_VkFormat(pCreateInfo->format));
2498 }
2499
Dustin Gravesc900f572016-05-16 11:07:59 -06002500 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002501 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002502 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2503 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Mike Weiblena6666382017-01-05 15:16:11 -07002504 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2505 VALIDATION_ERROR_00714, LayerName,
2506 "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2507 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2508 validation_error_map[VALIDATION_ERROR_00714]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002509 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002510
Dustin Gravesc900f572016-05-16 11:07:59 -06002511 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2512 // queueFamilyIndexCount uint32_t values
2513 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Mike Weiblena6666382017-01-05 15:16:11 -07002514 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2515 VALIDATION_ERROR_00713, LayerName,
2516 "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2517 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2518 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2519 validation_error_map[VALIDATION_ERROR_00713]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002520 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002521
Chris Forbes04b61da2016-11-03 09:53:59 +13002522 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002523 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002524 }
2525
2526 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002527 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002528 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002529 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002530
2531 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002532 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002533
2534 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002535 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002536
2537 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2538 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002539 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002540 VALIDATION_ERROR_02129, LayerName,
2541 "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2542 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1. %s",
2543 validation_error_map[VALIDATION_ERROR_02129]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002544 }
2545
2546 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2547 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2548 // extent.height must be equal
2549 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2550 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002551 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07002552 VALIDATION_ERROR_02127, LayerName,
2553 "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2554 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2555 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal. %s",
2556 validation_error_map[VALIDATION_ERROR_02127]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002557 }
2558
2559 if (pCreateInfo->extent.depth != 1) {
Mike Weiblena6666382017-01-05 15:16:11 -07002560 skip |= log_msg(
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002561 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2562 VALIDATION_ERROR_02130, LayerName,
Mike Weiblena6666382017-01-05 15:16:11 -07002563 "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1. %s",
2564 validation_error_map[VALIDATION_ERROR_02130]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002565 }
2566 }
2567
2568 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2569 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2570 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002571 skip |=
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002572 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07002573 VALIDATION_ERROR_02131, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002574 "vkCreateImage(): pCreateInfo->mipLevels must be less than or equal to "
Mike Weiblena6666382017-01-05 15:16:11 -07002575 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1. %s",
2576 validation_error_map[VALIDATION_ERROR_02131]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002577 }
2578
2579 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2580 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2581 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2582 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002583 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski181ec3a2016-12-14 13:37:04 -07002584 VALIDATION_ERROR_02160, LayerName,
2585 "vkCreateImage: if pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2586 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT. %s",
2587 validation_error_map[VALIDATION_ERROR_02160]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 }
Dave Houlton7e679e22017-01-23 16:37:04 -07002589
2590 // Check for combinations of attributes that are incompatible with having VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set
2591 if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) != 0) {
2592 // Linear tiling is unsupported
2593 if (VK_IMAGE_TILING_LINEAR == pCreateInfo->tiling) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002594 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Young0f183a82017-02-28 09:58:04 -07002595 INVALID_USAGE, LayerName,
2596 "vkCreateImage: if pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT "
2597 "then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
Dave Houlton7e679e22017-01-23 16:37:04 -07002598 }
2599
2600 // Sparse 1D image isn't valid
2601 if (VK_IMAGE_TYPE_1D == pCreateInfo->imageType) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002602 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Young0f183a82017-02-28 09:58:04 -07002603 VALIDATION_ERROR_02352, LayerName,
2604 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 1D image. %s",
2605 validation_error_map[VALIDATION_ERROR_02352]);
Dave Houlton7e679e22017-01-23 16:37:04 -07002606 }
2607
Dave Houlton7e679e22017-01-23 16:37:04 -07002608 // Sparse 2D image when device doesn't support it
2609 if ((VK_FALSE == device_data->physical_device_features.sparseResidencyImage2D) &&
2610 (VK_IMAGE_TYPE_2D == pCreateInfo->imageType)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002611 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dave Houlton7e679e22017-01-23 16:37:04 -07002612 VALIDATION_ERROR_02144, LayerName,
2613 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 2D image if corresponding "
2614 "feature is not enabled on the device. %s",
2615 validation_error_map[VALIDATION_ERROR_02144]);
2616 }
2617
2618 // Sparse 3D image when device doesn't support it
2619 if ((VK_FALSE == device_data->physical_device_features.sparseResidencyImage3D) &&
2620 (VK_IMAGE_TYPE_3D == pCreateInfo->imageType)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002621 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dave Houlton7e679e22017-01-23 16:37:04 -07002622 VALIDATION_ERROR_02145, LayerName,
2623 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 3D image if corresponding "
2624 "feature is not enabled on the device. %s",
2625 validation_error_map[VALIDATION_ERROR_02145]);
2626 }
2627
2628 // Multi-sample 2D image when device doesn't support it
2629 if (VK_IMAGE_TYPE_2D == pCreateInfo->imageType) {
2630 if ((VK_FALSE == device_data->physical_device_features.sparseResidency2Samples) &&
2631 (VK_SAMPLE_COUNT_2_BIT == pCreateInfo->samples)) {
2632 skip |= log_msg(
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002633 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dave Houlton7e679e22017-01-23 16:37:04 -07002634 VALIDATION_ERROR_02146, LayerName,
2635 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 2-sample image if corresponding "
2636 "feature is not enabled on the device. %s",
2637 validation_error_map[VALIDATION_ERROR_02146]);
2638 } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency4Samples) &&
2639 (VK_SAMPLE_COUNT_4_BIT == pCreateInfo->samples)) {
2640 skip |= log_msg(
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002641 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dave Houlton7e679e22017-01-23 16:37:04 -07002642 VALIDATION_ERROR_02147, LayerName,
2643 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 4-sample image if corresponding "
2644 "feature is not enabled on the device. %s",
2645 validation_error_map[VALIDATION_ERROR_02147]);
2646 } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency8Samples) &&
2647 (VK_SAMPLE_COUNT_8_BIT == pCreateInfo->samples)) {
2648 skip |= log_msg(
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002649 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dave Houlton7e679e22017-01-23 16:37:04 -07002650 VALIDATION_ERROR_02148, LayerName,
2651 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 8-sample image if corresponding "
2652 "feature is not enabled on the device. %s",
2653 validation_error_map[VALIDATION_ERROR_02148]);
2654 } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency16Samples) &&
2655 (VK_SAMPLE_COUNT_16_BIT == pCreateInfo->samples)) {
2656 skip |= log_msg(
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002657 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dave Houlton7e679e22017-01-23 16:37:04 -07002658 VALIDATION_ERROR_02149, LayerName,
2659 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 16-sample image if corresponding "
2660 "feature is not enabled on the device. %s",
2661 validation_error_map[VALIDATION_ERROR_02149]);
2662 }
2663 }
2664 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002665 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002666
Chris Forbes04b61da2016-11-03 09:53:59 +13002667 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002668 result = device_data->dispatch_table.CreateImage(device, pCreateInfo, pAllocator, pImage);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002669
Dustin Gravesf8032f22016-05-11 18:31:44 -06002670 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002671 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002672
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002673 return result;
2674}
2675
Chia-I Wu01ca2372016-05-13 14:37:49 +08002676VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002677 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002678 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002679 assert(my_data != NULL);
2680
Chris Forbes04b61da2016-11-03 09:53:59 +13002681 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002682
Chris Forbes04b61da2016-11-03 09:53:59 +13002683 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002684 my_data->dispatch_table.DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002685 }
2686}
2687
Mike Weiblen37166272017-01-05 15:11:00 -07002688static bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002689 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002690 if (pSubresource != nullptr) {
2691 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2692 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002693 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 -06002694 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002695 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2696 return false;
2697 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002698 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002699
2700 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002701}
2702
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002703VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2704 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002705 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002706 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002707 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002708
Chris Forbes04b61da2016-11-03 09:53:59 +13002709 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002710
Chris Forbes04b61da2016-11-03 09:53:59 +13002711 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002712 PreGetImageSubresourceLayout(device, pSubresource);
2713
Chris Forbese58c9fe2016-11-24 14:44:17 +13002714 my_data->dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002715 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002716}
2717
Chia-I Wu01ca2372016-05-13 14:37:49 +08002718VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2719 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002721 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002722 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002723 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002724 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002725
Chris Forbes04b61da2016-11-03 09:53:59 +13002726 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002727
Dustin Graves0b70a632016-04-27 17:44:56 -06002728 if (pCreateInfo != nullptr) {
2729 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002730 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2731 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002732 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
2733 LayerName,
2734 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2735 "pCreateInfo->subresourceRange.layerCount must be 1",
2736 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
Dustin Graves0b70a632016-04-27 17:44:56 -06002737 }
2738 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002739 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2740 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2741 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002742 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
2743 LayerName,
2744 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2745 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2746 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
Dustin Graves0b70a632016-04-27 17:44:56 -06002747 }
2748 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002749 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2750 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002751 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
2752 LayerName,
2753 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2754 "pCreateInfo->subresourceRange.layerCount must be 6");
Dustin Graves0b70a632016-04-27 17:44:56 -06002755 }
2756 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002757 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2758 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002759 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
2760 LayerName,
2761 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2762 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
Dustin Graves0b70a632016-04-27 17:44:56 -06002763 }
Mark Lobodzinski3d7e6b52017-02-28 13:45:20 -07002764 if (!my_data->physical_device_features.imageCubeArray) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002765 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
Mark Lobodzinski3d7e6b52017-02-28 13:45:20 -07002766 LayerName, "vkCreateImageView: Device feature imageCubeArray not enabled.");
2767 }
Dustin Graves0b70a632016-04-27 17:44:56 -06002768 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2769 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002770 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
2771 LayerName,
2772 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2773 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
Dustin Graves0b70a632016-04-27 17:44:56 -06002774 }
2775
Dustin Graves2a80dc62016-07-12 13:57:02 -06002776 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2777 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06002778 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
2779 LayerName,
2780 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2781 "pCreateInfo->subresourceRange.layerCount must be 1");
Dustin Graves0b70a632016-04-27 17:44:56 -06002782 }
2783 }
2784 }
2785
Chris Forbes04b61da2016-11-03 09:53:59 +13002786 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002787 result = my_data->dispatch_table.CreateImageView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002788
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002789 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002790 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002791
2792 return result;
2793}
2794
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002795VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002796 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002797 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002798 assert(my_data != NULL);
2799
Chris Forbes04b61da2016-11-03 09:53:59 +13002800 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002801
Chris Forbes04b61da2016-11-03 09:53:59 +13002802 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002803 my_data->dispatch_table.DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002804 }
2805}
2806
Chia-I Wu01ca2372016-05-13 14:37:49 +08002807VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002808 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002810 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002811 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002812 assert(my_data != NULL);
2813
Chris Forbes04b61da2016-11-03 09:53:59 +13002814 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002815
Chris Forbes04b61da2016-11-03 09:53:59 +13002816 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002817 result = my_data->dispatch_table.CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002818
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002819 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002820 }
2821
Michael Lentine03d8e572015-09-15 14:59:14 -05002822 return result;
2823}
2824
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002825VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2826 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002827 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002828 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002829 assert(my_data != NULL);
2830
Chris Forbes04b61da2016-11-03 09:53:59 +13002831 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002832
Chris Forbes04b61da2016-11-03 09:53:59 +13002833 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002834 my_data->dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002835 }
2836}
2837
Chia-I Wu01ca2372016-05-13 14:37:49 +08002838VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002839 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002840 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002841 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002842 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002843 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002844
Chris Forbes04b61da2016-11-03 09:53:59 +13002845 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002846
Chris Forbes04b61da2016-11-03 09:53:59 +13002847 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002848 result = my_data->dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002849
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002850 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002851 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002852
2853 return result;
2854}
2855
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002856VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2857 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002858 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002859 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002860 assert(my_data != NULL);
2861
Chris Forbes04b61da2016-11-03 09:53:59 +13002862 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002863
Chris Forbes04b61da2016-11-03 09:53:59 +13002864 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002865 my_data->dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002866 }
2867}
2868
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002869VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2870 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002871 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002872 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002873 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002874 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002875
Chris Forbes04b61da2016-11-03 09:53:59 +13002876 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002877
Chris Forbes04b61da2016-11-03 09:53:59 +13002878 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002879 result = my_data->dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002880
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002881 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002882 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002883
2884 return result;
2885}
2886
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002887VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2888 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002889 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002890 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002891 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002892 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002893
Chris Forbes04b61da2016-11-03 09:53:59 +13002894 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002895
Chris Forbes04b61da2016-11-03 09:53:59 +13002896 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002897 result = my_data->dispatch_table.MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002898
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002899 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002900 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002901
2902 return result;
2903}
2904
Mike Weiblen37166272017-01-05 15:11:00 -07002905static bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002906 layer_data *data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002907 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002908
2909 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002910 if (pCreateInfos != nullptr) {
Maks Naumov34f52a12016-12-28 01:15:17 +02002911 if (pCreateInfos->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002912 if (pCreateInfos->basePipelineIndex != -1) {
2913 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002914 skip |= log_msg(
2915 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2916 VALIDATION_ERROR_00526, LayerName,
2917 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2918 "pCreateInfos->flags "
2919 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2920 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002921 }
2922 }
2923
2924 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2925 if (pCreateInfos->basePipelineIndex != -1) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002926 skip |= log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002927 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 -06002928 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002929 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2930 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06002931 "VK_NULL_HANDLE. %s",
2932 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002933 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002934 }
2935 }
2936
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002937 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002938 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002939 skip |=
2940 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2941 UNRECOGNIZED_VALUE, LayerName,
2942 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2943 "unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002944 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002945
2946 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2947 (data->physical_device_features.fillModeNonSolid == false)) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002948 skip |= log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002949 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 -06002950 DEVICE_FEATURE, LayerName,
2951 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2952 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002953 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002954 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002955
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002956 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002957 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002958 skip |= validate_string(data->report_data, "vkCreateGraphicsPipelines",
2959 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
2960 pCreateInfos[i].pStages[j].pName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002961 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002962 }
2963
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002964 return skip;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002965}
2966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002967VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2968 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2969 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002970 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002971 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002972 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002973 assert(device_data != nullptr);
2974 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002975
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002976 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
2977 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002978
Dustin Gravesc900f572016-05-16 11:07:59 -06002979 if (pCreateInfos != nullptr) {
2980 for (uint32_t i = 0; i < createInfoCount; ++i) {
2981 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2982 if (pCreateInfos[i].pTessellationState == nullptr) {
2983 if (pCreateInfos[i].pStages != nullptr) {
2984 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2985 // pTessellationState must not be NULL
2986 bool has_control = false;
2987 bool has_eval = false;
2988
2989 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2990 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2991 has_control = true;
2992 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2993 has_eval = true;
2994 }
2995 }
2996
2997 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002998 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 -06002999 __LINE__, VALIDATION_ERROR_00536, LayerName,
3000 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
3001 "control shader stage and a tessellation evaluation shader stage, "
3002 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
3003 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003004 }
3005 }
Dustin Graves629259b2016-05-30 16:14:27 -06003006 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13003007 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003008 report_data, "vkCreateGraphicsPipelines",
3009 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
3010 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003011
Chris Forbes04b61da2016-11-03 09:53:59 +13003012 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003013 report_data, "vkCreateGraphicsPipelines",
3014 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
3015 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003016
3017 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003018 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 -06003019 __LINE__, VALIDATION_ERROR_00538, LayerName,
3020 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
3021 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
3022 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06003023 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003024 }
3025
3026 if (pCreateInfos[i].pViewportState == nullptr) {
3027 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
3028 // valid VkPipelineViewportStateCreateInfo structure
3029 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
3030 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003031 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06003032 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06003033 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06003034 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06003035 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
3036 "%s",
3037 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003038 }
3039 } else {
Mark Lobodzinskib81000e2016-12-16 13:08:00 -07003040 if (pCreateInfos[i].pViewportState->scissorCount != pCreateInfos[i].pViewportState->viewportCount) {
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06003041 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3042 __LINE__, VALIDATION_ERROR_01434, LayerName,
Mark Lobodzinskib81000e2016-12-16 13:08:00 -07003043 "Graphics Pipeline viewport count (%u) must match scissor count (%u). %s",
3044 pCreateInfos[i].pViewportState->viewportCount, pCreateInfos[i].pViewportState->scissorCount,
3045 validation_error_map[VALIDATION_ERROR_01434]);
3046 }
3047
Chris Forbes04b61da2016-11-03 09:53:59 +13003048 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003049 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3050 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
3051 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003052
Chris Forbes04b61da2016-11-03 09:53:59 +13003053 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003054 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
3055 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06003056 pCreateInfos[i].pViewportState->flags);
3057
Dustin Gravesc900f572016-05-16 11:07:59 -06003058 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003059 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003060 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3061 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
3062 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
3063 i);
Dustin Gravesc900f572016-05-16 11:07:59 -06003064 }
3065
Mark Lobodzinskid40eeb12016-12-18 09:43:01 -07003066 if (device_data->physical_device_features.multiViewport == false) {
3067 if (pCreateInfos[i].pViewportState->viewportCount != 1) {
3068 skip |=
3069 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3070 __LINE__, VALIDATION_ERROR_01430, LayerName,
3071 "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
3072 "pCreateInfos[%d].pViewportState->viewportCount must be 1 but is %d. %s",
3073 i, pCreateInfos[i].pViewportState->viewportCount, validation_error_map[VALIDATION_ERROR_01430]);
3074 }
3075 if (pCreateInfos[i].pViewportState->scissorCount != 1) {
3076 skip |=
3077 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3078 __LINE__, VALIDATION_ERROR_01431, LayerName,
3079 "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
3080 "pCreateInfos[%d].pViewportState->scissorCount must be 1 but is %d. %s",
3081 i, pCreateInfos[i].pViewportState->scissorCount, validation_error_map[VALIDATION_ERROR_01431]);
3082 }
3083 } else {
3084 if ((pCreateInfos[i].pViewportState->viewportCount < 1) ||
3085 (pCreateInfos[i].pViewportState->viewportCount > device_data->device_limits.maxViewports)) {
3086 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3087 __LINE__, VALIDATION_ERROR_01432, LayerName,
3088 "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
3089 "pCreateInfos[%d].pViewportState->viewportCount is %d but must be between 1 and "
3090 "maxViewports (%d), inclusive. %s",
3091 i, pCreateInfos[i].pViewportState->viewportCount, device_data->device_limits.maxViewports,
3092 validation_error_map[VALIDATION_ERROR_01432]);
3093 }
3094 if ((pCreateInfos[i].pViewportState->scissorCount < 1) ||
3095 (pCreateInfos[i].pViewportState->scissorCount > device_data->device_limits.maxViewports)) {
3096 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3097 __LINE__, VALIDATION_ERROR_01433, LayerName,
3098 "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
3099 "pCreateInfos[%d].pViewportState->scissorCount is %d but must be between 1 and "
3100 "maxViewports (%d), inclusive. %s",
3101 i, pCreateInfos[i].pViewportState->scissorCount, device_data->device_limits.maxViewports,
3102 validation_error_map[VALIDATION_ERROR_01433]);
3103 }
3104 }
3105
Dustin Gravesc900f572016-05-16 11:07:59 -06003106 if (pCreateInfos[i].pDynamicState != nullptr) {
3107 bool has_dynamic_viewport = false;
3108 bool has_dynamic_scissor = false;
3109
3110 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
3111 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
3112 has_dynamic_viewport = true;
3113 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
3114 has_dynamic_scissor = true;
3115 }
3116 }
3117
Dustin Gravesc900f572016-05-16 11:07:59 -06003118 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
3119 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
3120 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003121 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003122 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 -06003123 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06003124 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06003125 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
3126 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003127 }
3128
Dustin Gravesc900f572016-05-16 11:07:59 -06003129 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
3130 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
3131 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003132 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003133 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 -06003134 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06003135 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06003136 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
3137 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003138 }
3139 }
3140 }
3141
3142 if (pCreateInfos[i].pMultisampleState == nullptr) {
3143 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
3144 // a valid VkPipelineMultisampleStateCreateInfo structure
3145 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
3146 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06003147 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3148 __LINE__, VALIDATION_ERROR_02114, LayerName,
3149 "vkCreateGraphicsPipelines: if "
3150 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
3151 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
3152 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003153 }
Dustin Graves629259b2016-05-30 16:14:27 -06003154 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13003155 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003156 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3157 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003158 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003159
Chris Forbes04b61da2016-11-03 09:53:59 +13003160 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003161 report_data, "vkCreateGraphicsPipelines",
3162 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
3163 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003164
Chris Forbes04b61da2016-11-03 09:53:59 +13003165 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003166 report_data, "vkCreateGraphicsPipelines",
3167 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3168 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003169
Chris Forbes04b61da2016-11-03 09:53:59 +13003170 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003171 report_data, "vkCreateGraphicsPipelines",
3172 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3173 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3174 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3175 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003176
Chris Forbes04b61da2016-11-03 09:53:59 +13003177 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003178 report_data, "vkCreateGraphicsPipelines",
3179 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3180 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003181
Chris Forbes04b61da2016-11-03 09:53:59 +13003182 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003183 report_data, "vkCreateGraphicsPipelines",
3184 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3185 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003186
3187 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003188 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003189 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3190 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3191 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3192 i);
Dustin Graves629259b2016-05-30 16:14:27 -06003193 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003194 }
3195
3196 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003197 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003198 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003199 report_data, "vkCreateGraphicsPipelines",
3200 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3201 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003202
Chris Forbes04b61da2016-11-03 09:53:59 +13003203 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003204 report_data, "vkCreateGraphicsPipelines",
3205 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3206 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003207
Chris Forbes04b61da2016-11-03 09:53:59 +13003208 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003209 report_data, "vkCreateGraphicsPipelines",
3210 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3211 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003212
Chris Forbes04b61da2016-11-03 09:53:59 +13003213 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003214 report_data, "vkCreateGraphicsPipelines",
3215 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3216 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003217
Chris Forbes04b61da2016-11-03 09:53:59 +13003218 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003219 report_data, "vkCreateGraphicsPipelines",
3220 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3221 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3222 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003223
Chris Forbes04b61da2016-11-03 09:53:59 +13003224 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003225 report_data, "vkCreateGraphicsPipelines",
3226 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3227 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003228
Chris Forbes04b61da2016-11-03 09:53:59 +13003229 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003230 report_data, "vkCreateGraphicsPipelines",
3231 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3232 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003233
Chris Forbes04b61da2016-11-03 09:53:59 +13003234 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003235 report_data, "vkCreateGraphicsPipelines",
3236 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3237 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3238 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003239
Chris Forbes04b61da2016-11-03 09:53:59 +13003240 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003241 report_data, "vkCreateGraphicsPipelines",
3242 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3243 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3244 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003245
Chris Forbes04b61da2016-11-03 09:53:59 +13003246 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003247 report_data, "vkCreateGraphicsPipelines",
3248 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3249 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3250 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003251
Chris Forbes04b61da2016-11-03 09:53:59 +13003252 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003253 report_data, "vkCreateGraphicsPipelines",
3254 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3255 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3256 pCreateInfos[i].pDepthStencilState->front.compareOp);
3257
Chris Forbes04b61da2016-11-03 09:53:59 +13003258 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003259 report_data, "vkCreateGraphicsPipelines",
3260 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003261 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3262
Chris Forbes04b61da2016-11-03 09:53:59 +13003263 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003264 report_data, "vkCreateGraphicsPipelines",
3265 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003266 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3267
Chris Forbes04b61da2016-11-03 09:53:59 +13003268 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003269 report_data, "vkCreateGraphicsPipelines",
3270 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3271 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3272 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003273
Chris Forbes04b61da2016-11-03 09:53:59 +13003274 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003275 report_data, "vkCreateGraphicsPipelines",
3276 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3277 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3278 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003279
3280 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003281 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003282 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3283 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3284 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3285 i);
Dustin Graves629259b2016-05-30 16:14:27 -06003286 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003287 }
3288
3289 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3290 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003291 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003292 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3293 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3294 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003295
Chris Forbes04b61da2016-11-03 09:53:59 +13003296 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003297 report_data, "vkCreateGraphicsPipelines",
3298 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3299 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003300
Chris Forbes04b61da2016-11-03 09:53:59 +13003301 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003302 report_data, "vkCreateGraphicsPipelines",
3303 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3304 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003305
Chris Forbes04b61da2016-11-03 09:53:59 +13003306 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003307 report_data, "vkCreateGraphicsPipelines",
3308 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3309 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3310 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003311
3312 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3313 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3314 ++attachmentIndex) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003315 skip |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3316 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3317 ParameterName::IndexVector{i, attachmentIndex}),
3318 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003319
Chris Forbes04b61da2016-11-03 09:53:59 +13003320 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003321 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003322 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3323 ParameterName::IndexVector{i, attachmentIndex}),
3324 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003325 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3326
Chris Forbes04b61da2016-11-03 09:53:59 +13003327 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003328 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003329 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3330 ParameterName::IndexVector{i, attachmentIndex}),
3331 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003332 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3333
Chris Forbes04b61da2016-11-03 09:53:59 +13003334 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003335 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3336 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3337 ParameterName::IndexVector{i, attachmentIndex}),
3338 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3339 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003340
Chris Forbes04b61da2016-11-03 09:53:59 +13003341 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003342 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003343 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3344 ParameterName::IndexVector{i, attachmentIndex}),
3345 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003346 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3347
Chris Forbes04b61da2016-11-03 09:53:59 +13003348 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003349 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003350 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3351 ParameterName::IndexVector{i, attachmentIndex}),
3352 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003353 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3354
Chris Forbes04b61da2016-11-03 09:53:59 +13003355 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003356 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3357 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3358 ParameterName::IndexVector{i, attachmentIndex}),
3359 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3360 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003361
Chris Forbes04b61da2016-11-03 09:53:59 +13003362 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003363 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003364 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3365 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003366 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3367 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3368 }
3369 }
3370
Dustin Gravesc900f572016-05-16 11:07:59 -06003371 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003372 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003373 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3374 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3375 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3376 i);
Dustin Gravesc900f572016-05-16 11:07:59 -06003377 }
3378
3379 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3380 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003381 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003382 report_data, "vkCreateGraphicsPipelines",
3383 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003384 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3385 }
3386 }
3387 }
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003388 skip |= PreCreateGraphicsPipelines(device, pCreateInfos);
Dustin Gravesc900f572016-05-16 11:07:59 -06003389 }
3390
Chris Forbes04b61da2016-11-03 09:53:59 +13003391 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003392 result = device_data->dispatch_table.CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos,
3393 pAllocator, pPipelines);
Dustin Gravesc900f572016-05-16 11:07:59 -06003394 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003395 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003396
3397 return result;
3398}
3399
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003400bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003401 layer_data *data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003402 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003403 if (pCreateInfos != nullptr) {
3404 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003405 uint32_t i = 0;
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003406 skip |= validate_string(data->report_data, "vkCreateComputePipelines",
3407 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}),
3408 pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003409 }
3410
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003411 return skip;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003412}
3413
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003414VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3415 const VkComputePipelineCreateInfo *pCreateInfos,
3416 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003417 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003418 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003419 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003420 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003421
Chris Forbes04b61da2016-11-03 09:53:59 +13003422 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003423 pAllocator, pPipelines);
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003424 skip |= PreCreateComputePipelines(device, pCreateInfos);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003425
Chris Forbes04b61da2016-11-03 09:53:59 +13003426 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003427 result = my_data->dispatch_table.CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
3428 pPipelines);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003429 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003430 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003431
3432 return result;
3433}
3434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003435VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003436 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003437 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003438 assert(my_data != NULL);
3439
Chris Forbes04b61da2016-11-03 09:53:59 +13003440 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003441
Chris Forbes04b61da2016-11-03 09:53:59 +13003442 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003443 my_data->dispatch_table.DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003444 }
3445}
3446
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003447VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3448 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003449 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003450 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003451 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003452 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003453
Chris Forbes04b61da2016-11-03 09:53:59 +13003454 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003455
Chris Forbes04b61da2016-11-03 09:53:59 +13003456 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 result = my_data->dispatch_table.CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003458
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003459 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003460 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003461
3462 return result;
3463}
3464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003465VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3466 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003467 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003468 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003469 assert(my_data != NULL);
3470
Chris Forbes04b61da2016-11-03 09:53:59 +13003471 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003472
Chris Forbes04b61da2016-11-03 09:53:59 +13003473 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003474 my_data->dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003475 }
3476}
3477
Chia-I Wu01ca2372016-05-13 14:37:49 +08003478VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3479 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003480 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003481 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003482 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003483 assert(device_data != NULL);
3484 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003485
Chris Forbes04b61da2016-11-03 09:53:59 +13003486 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003487
Dustin Gravesc900f572016-05-16 11:07:59 -06003488 if (pCreateInfo != nullptr) {
Mark Lobodzinski262f61f2017-03-01 15:52:49 -07003489
3490 if ((device_data->physical_device_features.samplerAnisotropy == false) && (pCreateInfo->maxAnisotropy != 1.0)) {
3491 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3492 DEVICE_FEATURE, LayerName,
3493 "vkCreateSampler(): The samplerAnisotropy feature is not enabled, so the maxAnisotropy member of the "
3494 "VkSamplerCreateInfo structure must be 1.0 but is %f.",
3495 pCreateInfo->maxAnisotropy);
3496 }
3497
Dustin Gravesc900f572016-05-16 11:07:59 -06003498 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3499 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003500 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003501 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
Dustin Gravesc900f572016-05-16 11:07:59 -06003502 }
3503
3504 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3505 // valid VkBorderColor value
3506 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3507 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3508 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003509 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003510 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
Dustin Gravesc900f572016-05-16 11:07:59 -06003511 }
3512 }
3513
Chris Forbes04b61da2016-11-03 09:53:59 +13003514 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003515 result = device_data->dispatch_table.CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003516
Dustin Gravesc900f572016-05-16 11:07:59 -06003517 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003518 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003519
3520 return result;
3521}
3522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003523VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003524 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003525 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003526 assert(my_data != NULL);
3527
Chris Forbes04b61da2016-11-03 09:53:59 +13003528 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003529
Chris Forbes04b61da2016-11-03 09:53:59 +13003530 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003531 my_data->dispatch_table.DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003532 }
3533}
3534
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003535VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3536 const VkAllocationCallbacks *pAllocator,
3537 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003538 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003539 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003540 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003541 assert(device_data != nullptr);
3542 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003543
Chris Forbes04b61da2016-11-03 09:53:59 +13003544 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003545
Dustin Gravesc900f572016-05-16 11:07:59 -06003546 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3547 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3548 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3549 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3550 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3551 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3552 // valid VkSampler handles
3553 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3554 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3555 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3556 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3557 ++descriptor_index) {
3558 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003559 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3560 __LINE__, REQUIRED_PARAMETER, LayerName,
3561 "vkCreateDescriptorSetLayout: required parameter "
3562 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3563 " specified as VK_NULL_HANDLE",
3564 i, descriptor_index);
Dustin Gravesc900f572016-05-16 11:07:59 -06003565 }
3566 }
3567 }
3568
3569 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3570 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3571 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Mike Weiblena6666382017-01-05 15:16:11 -07003572 skip |= log_msg(
3573 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3574 VALIDATION_ERROR_00853, LayerName,
3575 "vkCreateDescriptorSetLayout(): if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3576 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values. %s",
3577 i, i, validation_error_map[VALIDATION_ERROR_00853]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003578 }
3579 }
3580 }
3581 }
3582
Chris Forbes04b61da2016-11-03 09:53:59 +13003583 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003584 result = device_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003585
Dustin Gravesc900f572016-05-16 11:07:59 -06003586 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003587 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003588
3589 return result;
3590}
3591
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003592VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3593 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003594 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003595 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003596 assert(my_data != NULL);
3597
Chris Forbes04b61da2016-11-03 09:53:59 +13003598 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003599
Chris Forbes04b61da2016-11-03 09:53:59 +13003600 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003601 my_data->dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003602 }
3603}
3604
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003605VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3606 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003607 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003608 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003609 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003610 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003611
Chris Forbes04b61da2016-11-03 09:53:59 +13003612 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003613
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003614 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3615
Chris Forbes04b61da2016-11-03 09:53:59 +13003616 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003617 result = my_data->dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003618
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003619 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003620 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003621
3622 return result;
3623}
3624
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003625VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3626 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003627 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003628 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003629 assert(my_data != NULL);
3630
Chris Forbes04b61da2016-11-03 09:53:59 +13003631 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003632
Chris Forbes04b61da2016-11-03 09:53:59 +13003633 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003634 my_data->dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003635 }
3636}
3637
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003638VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3639 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003640 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003641 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003642 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003643 assert(my_data != NULL);
3644
Chris Forbes04b61da2016-11-03 09:53:59 +13003645 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003646
Chris Forbes04b61da2016-11-03 09:53:59 +13003647 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003648 result = my_data->dispatch_table.ResetDescriptorPool(device, descriptorPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003649
3650 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3651 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003652
3653 return result;
3654}
3655
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003656VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3657 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003658 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003659 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003660 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003661 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003662
Chris Forbes04b61da2016-11-03 09:53:59 +13003663 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003664
Chris Forbes04b61da2016-11-03 09:53:59 +13003665 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003666 result = my_data->dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003667
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003668 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003669 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003670
3671 return result;
3672}
3673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003674VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003675 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003676 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003677 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003678 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003679 assert(device_data != nullptr);
3680 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003681
Chris Forbes04b61da2016-11-03 09:53:59 +13003682 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003683
Dustin Gravesc900f572016-05-16 11:07:59 -06003684 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3685 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3686 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003687 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003688 pDescriptorSets, true, true);
Dustin Gravesc900f572016-05-16 11:07:59 -06003689
Chris Forbes04b61da2016-11-03 09:53:59 +13003690 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003691 result = device_data->dispatch_table.FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003692
Dustin Gravesc900f572016-05-16 11:07:59 -06003693 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003694 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003695
3696 return result;
3697}
3698
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003699VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3700 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3701 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003702 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003703 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003704 assert(device_data != NULL);
3705 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003706
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003707 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
3708 pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003709
Dustin Gravesc900f572016-05-16 11:07:59 -06003710 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3711 if (pDescriptorWrites != NULL) {
3712 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3713 // descriptorCount must be greater than 0
3714 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003715 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003716 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07003717 VALIDATION_ERROR_00957, LayerName,
3718 "vkUpdateDescriptorSets(): parameter pDescriptorWrites[%d].descriptorCount must be greater than 0. %s",
3719 i, validation_error_map[VALIDATION_ERROR_00957]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003720 }
3721
Dustin Gravesce68f082017-03-30 15:42:16 -06003722 // dstSet must be a valid VkDescriptorSet handle
3723 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3724 ParameterName("pDescriptorWrites[%i].dstSet", ParameterName::IndexVector{i}),
3725 pDescriptorWrites[i].dstSet);
3726
Dustin Gravesc900f572016-05-16 11:07:59 -06003727 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3728 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3729 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3730 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3731 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3732 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3733 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3734 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3735 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003736 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblena6666382017-01-05 15:16:11 -07003737 __LINE__, VALIDATION_ERROR_00939, LayerName,
3738 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
3739 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3740 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3741 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL. %s",
3742 i, i, validation_error_map[VALIDATION_ERROR_00939]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003743 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3744 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3745 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3746 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3747 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3748 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003749 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003750 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3751 ParameterName::IndexVector{i, descriptor_index}),
3752 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003753 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003754 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3755 ParameterName::IndexVector{i, descriptor_index}),
3756 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3757 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
Dustin Gravesc900f572016-05-16 11:07:59 -06003758 }
3759 }
3760 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3761 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3762 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3763 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3764 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3765 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3766 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3767 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003768 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblena6666382017-01-05 15:16:11 -07003769 __LINE__, VALIDATION_ERROR_00941, LayerName,
3770 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
3771 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3772 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3773 "pDescriptorWrites[%d].pBufferInfo must not be NULL. %s",
3774 i, i, validation_error_map[VALIDATION_ERROR_00941]);
Dustin Graves629259b2016-05-30 16:14:27 -06003775 } else {
3776 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003777 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003778 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3779 ParameterName::IndexVector{i, descriptorIndex}),
3780 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
Dustin Graves629259b2016-05-30 16:14:27 -06003781 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003782 }
3783 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3784 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3785 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3786 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3787 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003788 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblena6666382017-01-05 15:16:11 -07003789 __LINE__, VALIDATION_ERROR_00940, LayerName,
3790 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
3791 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3792 "pDescriptorWrites[%d].pTexelBufferView must not be NULL. %s",
3793 i, i, validation_error_map[VALIDATION_ERROR_00940]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003794 } else {
3795 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3796 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003797 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003798 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3799 ParameterName::IndexVector{i, descriptor_index}),
3800 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003801 }
3802 }
3803 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003804
3805 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3806 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3807 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3808 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3809 if (pDescriptorWrites[i].pBufferInfo != NULL) {
Dave Houlton1d2022c2017-03-29 11:43:58 -06003810 if (SafeModulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07003811 skip |= log_msg(
3812 device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3813 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, VALIDATION_ERROR_00944, LayerName,
3814 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3815 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s",
3816 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment,
3817 validation_error_map[VALIDATION_ERROR_00944]);
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003818 }
3819 }
3820 }
3821 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3822 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3823 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3824 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3825 if (pDescriptorWrites[i].pBufferInfo != NULL) {
Dave Houlton1d2022c2017-03-29 11:43:58 -06003826 if (SafeModulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07003827 skip |= log_msg(
3828 device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3829 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, VALIDATION_ERROR_00945, LayerName,
3830 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3831 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s",
3832 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment,
3833 validation_error_map[VALIDATION_ERROR_00945]);
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003834 }
3835 }
3836 }
3837 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003838 }
3839 }
3840
Chris Forbes04b61da2016-11-03 09:53:59 +13003841 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003842 device_data->dispatch_table.UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
3843 pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003844 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003845}
3846
Chia-I Wu01ca2372016-05-13 14:37:49 +08003847VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003848 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003849 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003850 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003851 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003852 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003853
Chris Forbes04b61da2016-11-03 09:53:59 +13003854 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003855
Chris Forbes04b61da2016-11-03 09:53:59 +13003856 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003857 result = my_data->dispatch_table.CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003858
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003859 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003860 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003861
3862 return result;
3863}
3864
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003865VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003866 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003867 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003868 assert(my_data != NULL);
3869
Chris Forbes04b61da2016-11-03 09:53:59 +13003870 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003871
Chris Forbes04b61da2016-11-03 09:53:59 +13003872 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003873 my_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003874 }
3875}
3876
Mike Weiblen37166272017-01-05 15:11:00 -07003877static bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003878 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003879 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3880
Mark Lobodzinskie907fe42017-01-27 14:50:23 -07003881 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
3882 if (pCreateInfo->pAttachments[i].format == VK_FORMAT_UNDEFINED) {
3883 std::stringstream ss;
3884 ss << "vkCreateRenderPass: pCreateInfo->pAttachments[" << i << "].format is VK_FORMAT_UNDEFINED. "
3885 << validation_error_map[VALIDATION_ERROR_00336];
Mark Lobodzinskieb9e73f2017-04-13 10:06:48 -06003886 skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3887 __LINE__, VALIDATION_ERROR_00336, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskie907fe42017-01-27 14:50:23 -07003888 }
3889 }
3890
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003891 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3892 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Mike Weiblena6666382017-01-05 15:16:11 -07003893 skip |=
3894 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3895 VALIDATION_ERROR_00348, "DL", "Cannot create a render pass with %d color attachments. Max is %d. %s",
3896 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments,
3897 validation_error_map[VALIDATION_ERROR_00348]);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003898 }
3899 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003900 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003901}
3902
Chia-I Wu01ca2372016-05-13 14:37:49 +08003903VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003904 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003905 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003906 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003907 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003908 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003909
Chris Forbes04b61da2016-11-03 09:53:59 +13003910 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3911 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003912
Chris Forbes04b61da2016-11-03 09:53:59 +13003913 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003914 result = my_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003915
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003916 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003917 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003918
3919 return result;
3920}
3921
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003922VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003923 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003924 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003925 assert(my_data != NULL);
3926
Chris Forbes04b61da2016-11-03 09:53:59 +13003927 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003928
Chris Forbes04b61da2016-11-03 09:53:59 +13003929 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003930 my_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003931 }
3932}
3933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003934VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003935 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003936 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003937 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003938
Chris Forbes04b61da2016-11-03 09:53:59 +13003939 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003940
Chris Forbes04b61da2016-11-03 09:53:59 +13003941 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003942 my_data->dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003943 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003944}
3945
Chia-I Wu01ca2372016-05-13 14:37:49 +08003946VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003947 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003948 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003949 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003950 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003951 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003952
Chris Forbes04b61da2016-11-03 09:53:59 +13003953 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003954 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003955
Chris Forbes04b61da2016-11-03 09:53:59 +13003956 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003957
Chris Forbes04b61da2016-11-03 09:53:59 +13003958 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003959 result = my_data->dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003960
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003961 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003962 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003963
3964 return result;
3965}
3966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003967VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003968 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003969 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003970 assert(my_data != NULL);
3971
Chris Forbes04b61da2016-11-03 09:53:59 +13003972 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003973
Chris Forbes04b61da2016-11-03 09:53:59 +13003974 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003975 my_data->dispatch_table.DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003976 }
3977}
3978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003979VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003980 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003981 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003982 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003983 assert(my_data != NULL);
3984
Chris Forbes04b61da2016-11-03 09:53:59 +13003985 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003986
Chris Forbes04b61da2016-11-03 09:53:59 +13003987 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003988 result = my_data->dispatch_table.ResetCommandPool(device, commandPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003989
3990 validate_result(my_data->report_data, "vkResetCommandPool", result);
3991 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003992
3993 return result;
3994}
3995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003996VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3997 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003998 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003999 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004000 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004001 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004002
Chris Forbes04b61da2016-11-03 09:53:59 +13004003 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004004
Chris Forbes04b61da2016-11-03 09:53:59 +13004005 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004006 result = my_data->dispatch_table.AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004007
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004008 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004009 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004010
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004011 return result;
4012}
4013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004014VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08004015 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004016 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004017 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06004018 assert(device_data != nullptr);
4019 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004020
Chris Forbes04b61da2016-11-03 09:53:59 +13004021 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004022
Dustin Gravesc900f572016-05-16 11:07:59 -06004023 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
4024 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
4025 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13004026 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004027 pCommandBuffers, true, true);
Dustin Gravesc900f572016-05-16 11:07:59 -06004028
Chris Forbes04b61da2016-11-03 09:53:59 +13004029 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004030 device_data->dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004031 }
4032}
4033
Mike Weiblen37166272017-01-05 15:11:00 -07004034static bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004035 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004036 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
4037
4038 if (pInfo != NULL) {
Chris Forbesc5554a52016-11-24 14:45:16 +13004039 if ((dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Mike Weiblena6666382017-01-05 15:16:11 -07004040 skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
4041 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, VALIDATION_ERROR_00116, LayerName,
4042 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
4043 "inheritedQueries. %s",
4044 validation_error_map[VALIDATION_ERROR_00116]);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004045 }
Mark Lobodzinski38df4562016-12-15 13:06:55 -07004046 // VALIDATION_ERROR_00117 check
4047 if ((dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
4048 skip |= validate_flags(dev_data->report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
4049 "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pInfo->queryFlags, false);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004050 }
4051 }
Chris Forbes04b61da2016-11-03 09:53:59 +13004052 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004053}
4054
4055VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004056 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004057 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004058 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06004059 assert(device_data != nullptr);
4060 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004061
Chris Forbes04b61da2016-11-03 09:53:59 +13004062 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004063
Dustin Gravesc900f572016-05-16 11:07:59 -06004064 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
4065 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13004066 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004067 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
4068 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
Dustin Gravesc900f572016-05-16 11:07:59 -06004069
4070 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004071 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004072 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06004073
Chris Forbes04b61da2016-11-03 09:53:59 +13004074 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004075 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06004076
Dustin Gravesc900f572016-05-16 11:07:59 -06004077 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13004078 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06004079 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
4080
4081 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13004082 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004083 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
4084 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
Dustin Gravesc900f572016-05-16 11:07:59 -06004085 }
4086
Chris Forbes04b61da2016-11-03 09:53:59 +13004087 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004088
Chris Forbes04b61da2016-11-03 09:53:59 +13004089 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004090 result = device_data->dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004091
Dustin Gravesc900f572016-05-16 11:07:59 -06004092 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004093 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004094
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004095 return result;
4096}
4097
Chia-I Wu01ca2372016-05-13 14:37:49 +08004098VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004099 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004100 assert(my_data != NULL);
4101
Chris Forbese58c9fe2016-11-24 14:44:17 +13004102 VkResult result = my_data->dispatch_table.EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004103
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004104 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004106 return result;
4107}
4108
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004109VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06004110 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004111 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004112 assert(my_data != NULL);
4113
Chris Forbes04b61da2016-11-03 09:53:59 +13004114 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004115
Chris Forbes04b61da2016-11-03 09:53:59 +13004116 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004117 result = my_data->dispatch_table.ResetCommandBuffer(commandBuffer, flags);
Dustin Graves16d18972016-05-09 17:36:57 -06004118
4119 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
4120 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004121
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004122 return result;
4123}
4124
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004125VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4126 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004127 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004128 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves29148ff2016-03-23 19:44:00 -06004129 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004130
Chris Forbes04b61da2016-11-03 09:53:59 +13004131 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06004132
Chris Forbes04b61da2016-11-03 09:53:59 +13004133 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004134 my_data->dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06004135 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004136}
4137
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004138static bool preCmdSetViewport(layer_data *my_data, uint32_t first_viewport, uint32_t viewport_count, const VkViewport *viewports) {
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004139 debug_report_data *report_data = my_data->report_data;
4140
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004141 bool skip =
4142 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004143
4144 if (viewport_count > 0 && viewports != nullptr) {
4145 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
4146 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
4147 const VkViewport &viewport = viewports[viewportIndex];
4148
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004149 if (my_data->physical_device_features.multiViewport == false) {
4150 if (viewport_count != 1) {
4151 skip |= log_msg(
4152 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4153 DEVICE_FEATURE, LayerName,
4154 "vkCmdSetViewport(): The multiViewport feature is not enabled, so viewportCount must be 1 but is %d.",
4155 viewport_count);
4156 }
4157 if (first_viewport != 0) {
4158 skip |= log_msg(
4159 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4160 DEVICE_FEATURE, LayerName,
4161 "vkCmdSetViewport(): The multiViewport feature is not enabled, so firstViewport must be 0 but is %d.",
4162 first_viewport);
4163 }
4164 }
4165
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004166 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
4167 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4168 VALIDATION_ERROR_01448, LayerName,
4169 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
4170 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
4171 }
4172
4173 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
Mark Lobodzinski885790e2017-03-09 11:54:48 -07004174 if ((my_data->enables.amd_negative_viewport_height || my_data->enables.khr_maintenance1) && (viewport.height < 0)) {
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004175 // VALIDATION_ERROR_01790
4176 invalid_height = false;
4177 }
4178 if (invalid_height) {
4179 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4180 VALIDATION_ERROR_01449, LayerName,
4181 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
4182 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
4183 }
4184
4185 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
4186 skip |=
4187 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4188 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
4189 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4190 validation_error_map[VALIDATION_ERROR_01450]);
4191 }
4192
4193 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
4194 skip |=
4195 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4196 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
4197 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4198 validation_error_map[VALIDATION_ERROR_01450]);
4199 }
4200
4201 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
4202 skip |=
4203 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4204 VALIDATION_ERROR_01451, LayerName,
4205 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
4206 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
4207 }
4208
4209 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
4210 skip |=
4211 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4212 VALIDATION_ERROR_01452, LayerName,
4213 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
4214 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
4215 }
4216 }
4217 }
4218
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004219 return skip;
4220}
4221
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004222VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4223 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004224 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004225 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004226 assert(my_data != NULL);
4227
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004228 skip |= preCmdSetViewport(my_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004229
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004230 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004231 my_data->dispatch_table.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004232 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004233}
4234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004235VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4236 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004237 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004238 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004239 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004240 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004241
Chris Forbes04b61da2016-11-03 09:53:59 +13004242 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004243
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004244 if (my_data->physical_device_features.multiViewport == false) {
4245 if (scissorCount != 1) {
4246 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4247 DEVICE_FEATURE, LayerName,
4248 "vkCmdSetScissor(): The multiViewport feature is not enabled, so scissorCount must be 1 but is %d.",
4249 scissorCount);
4250 }
4251 if (firstScissor != 0) {
4252 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4253 DEVICE_FEATURE, LayerName,
4254 "vkCmdSetScissor(): The multiViewport feature is not enabled, so firstScissor must be 0 but is %d.",
4255 firstScissor);
4256 }
4257 }
4258
Mike Weiblena4742dc2016-10-31 11:05:56 -06004259 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4260 const VkRect2D &pScissor = pScissors[scissorIndex];
4261
4262 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004263 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004264 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4265 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004266 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004267 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004268 VALIDATION_ERROR_01490, LayerName,
4269 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4270 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004271 }
4272
4273 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004274 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004275 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4276 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004277 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004278 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004279 VALIDATION_ERROR_01491, LayerName,
4280 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4281 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004282 }
4283 }
4284
Chris Forbes04b61da2016-11-03 09:53:59 +13004285 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004286 my_data->dispatch_table.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004287 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004288}
4289
Chia-I Wu01ca2372016-05-13 14:37:49 +08004290VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004291 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004292 my_data->dispatch_table.CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004293}
4294
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004295VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4296 float depthBiasSlopeFactor) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004297 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004298 my_data->dispatch_table.CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004299}
4300
Chia-I Wu01ca2372016-05-13 14:37:49 +08004301VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004302 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004303 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004304 assert(my_data != NULL);
4305
Chris Forbes04b61da2016-11-03 09:53:59 +13004306 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004307
Chris Forbes04b61da2016-11-03 09:53:59 +13004308 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004309 my_data->dispatch_table.CmdSetBlendConstants(commandBuffer, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004310 }
Cody Northrop12365112015-08-17 11:10:49 -06004311}
4312
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004313VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004314 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004315 my_data->dispatch_table.CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004316}
4317
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004318VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4319 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004320 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004321 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves46948e62016-05-06 10:16:06 -06004322 assert(my_data != NULL);
4323
Chris Forbes04b61da2016-11-03 09:53:59 +13004324 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004325
Chris Forbes04b61da2016-11-03 09:53:59 +13004326 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004327 my_data->dispatch_table.CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004328 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004329}
4330
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004331VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004332 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004333 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves46948e62016-05-06 10:16:06 -06004334 assert(my_data != NULL);
4335
Chris Forbes04b61da2016-11-03 09:53:59 +13004336 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004337
Chris Forbes04b61da2016-11-03 09:53:59 +13004338 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004339 my_data->dispatch_table.CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004340 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004341}
4342
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004343VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004344 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004345 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves46948e62016-05-06 10:16:06 -06004346 assert(my_data != NULL);
4347
Chris Forbes04b61da2016-11-03 09:53:59 +13004348 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004349
Chris Forbes04b61da2016-11-03 09:53:59 +13004350 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004351 my_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004352 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004353}
4354
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004355VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4356 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4357 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4358 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004359 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004360 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004361 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004362
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004363 skip |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet,
4364 descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004365
Chris Forbes04b61da2016-11-03 09:53:59 +13004366 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004367 my_data->dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4368 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004369 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004370}
4371
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004372VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4373 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004374 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004375 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves29148ff2016-03-23 19:44:00 -06004376 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004377
Chris Forbes04b61da2016-11-03 09:53:59 +13004378 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004379
Chris Forbes04b61da2016-11-03 09:53:59 +13004380 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004381 my_data->dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004382 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004383}
4384
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004385VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4386 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004387 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004388 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004389 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004390
Chris Forbes04b61da2016-11-03 09:53:59 +13004391 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004392
Chris Forbes04b61da2016-11-03 09:53:59 +13004393 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004394 my_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004395 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004396}
4397
Mike Weiblen37166272017-01-05 15:11:00 -07004398static bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004399 uint32_t firstInstance) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004400 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004401 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004402 // 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 -07004403 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004404 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 -06004405 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004406 return false;
4407 }
4408
4409 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004410 // 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 -07004411 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004412 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 -06004413 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004414 return false;
4415 }
4416
4417 return true;
4418}
4419
Chia-I Wu01ca2372016-05-13 14:37:49 +08004420VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4421 uint32_t firstVertex, uint32_t firstInstance) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004422 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004423 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004424
Chris Forbese58c9fe2016-11-24 14:44:17 +13004425 my_data->dispatch_table.CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004426}
4427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004428VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4429 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004430 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004431 my_data->dispatch_table.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004432}
4433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004434VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4435 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004436 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004437 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004438 assert(my_data != NULL);
4439
Mark Lobodzinski33d8c9b2017-02-28 14:18:04 -07004440 if (!my_data->physical_device_features.multiDrawIndirect && ((count > 1))) {
4441 skip = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4442 DEVICE_FEATURE, LayerName,
4443 "CmdDrawIndirect(): Device feature multiDrawIndirect disabled: count must be 0 or 1 but is %d", count);
4444 }
Chris Forbes04b61da2016-11-03 09:53:59 +13004445 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004446
Chris Forbes04b61da2016-11-03 09:53:59 +13004447 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004448 my_data->dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004449 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004450}
4451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004452VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4453 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004454 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004455 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004456 assert(my_data != NULL);
Mark Lobodzinski33d8c9b2017-02-28 14:18:04 -07004457 if (!my_data->physical_device_features.multiDrawIndirect && ((count > 1))) {
4458 skip =
4459 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4460 DEVICE_FEATURE, LayerName,
4461 "CmdDrawIndexedIndirect(): Device feature multiDrawIndirect disabled: count must be 0 or 1 but is %d", count);
4462 }
Chris Forbes04b61da2016-11-03 09:53:59 +13004463 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004464
Chris Forbes04b61da2016-11-03 09:53:59 +13004465 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004466 my_data->dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004467 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004468}
4469
Chia-I Wu01ca2372016-05-13 14:37:49 +08004470VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004471 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004472 my_data->dispatch_table.CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004473}
4474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004475VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004476 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004477 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004478 assert(my_data != NULL);
4479
Chris Forbes04b61da2016-11-03 09:53:59 +13004480 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004481
Chris Forbes04b61da2016-11-03 09:53:59 +13004482 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004483 my_data->dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004484 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004485}
4486
Chia-I Wu01ca2372016-05-13 14:37:49 +08004487VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4488 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004489 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004490 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004491 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004492
Chris Forbes04b61da2016-11-03 09:53:59 +13004493 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004494
Chris Forbes04b61da2016-11-03 09:53:59 +13004495 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004496 my_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004497 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004498}
4499
Mike Weiblen37166272017-01-05 15:11:00 -07004500static bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004501 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004502 if (pRegions != nullptr) {
4503 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4504 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07004505 log_msg(
4506 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4507 VALIDATION_ERROR_01225, LayerName,
4508 "vkCmdCopyImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator. %s",
4509 validation_error_map[VALIDATION_ERROR_01225]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004510 return false;
4511 }
4512 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4513 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07004514 log_msg(
4515 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4516 VALIDATION_ERROR_01225, LayerName,
4517 "vkCmdCopyImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator. %s",
4518 validation_error_map[VALIDATION_ERROR_01225]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004519 return false;
4520 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004521 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004522
4523 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004524}
4525
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004526VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4527 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4528 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004529 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004530 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004531 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004532
Chris Forbes04b61da2016-11-03 09:53:59 +13004533 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004534 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004535
Chris Forbes04b61da2016-11-03 09:53:59 +13004536 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004537 PreCmdCopyImage(commandBuffer, pRegions);
4538
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004539 my_data->dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4540 pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004541 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004542}
4543
Mike Weiblen37166272017-01-05 15:11:00 -07004544static bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004545 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004546 if (pRegions != nullptr) {
4547 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4548 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004549 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 -06004550 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004551 "vkCmdBlitImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004552 return false;
4553 }
4554 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4555 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004556 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 -06004557 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004558 "vkCmdBlitImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004559 return false;
4560 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004561 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004562
4563 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004564}
4565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004566VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4567 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4568 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004569 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004570 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004571 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004572
Chris Forbes04b61da2016-11-03 09:53:59 +13004573 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004574 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004575
Chris Forbes04b61da2016-11-03 09:53:59 +13004576 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004577 PreCmdBlitImage(commandBuffer, pRegions);
4578
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004579 my_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4580 pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004581 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004582}
4583
Mike Weiblen37166272017-01-05 15:11:00 -07004584static bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004585 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004586 if (pRegions != nullptr) {
4587 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4588 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004589 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 -06004590 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004591 "vkCmdCopyBufferToImage() parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004592 "enumerator");
4593 return false;
4594 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004595 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004596
4597 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004598}
4599
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004600VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4601 VkImageLayout dstImageLayout, uint32_t regionCount,
4602 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004603 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004604 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004605 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004606
Chris Forbes04b61da2016-11-03 09:53:59 +13004607 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004608 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004609
Chris Forbes04b61da2016-11-03 09:53:59 +13004610 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004611 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4612
Chris Forbese58c9fe2016-11-24 14:44:17 +13004613 my_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004614 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004615}
4616
Mike Weiblen37166272017-01-05 15:11:00 -07004617static bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004618 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004619 if (pRegions != nullptr) {
4620 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4621 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004622 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 -06004623 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004624 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4625 "enumerator");
4626 return false;
4627 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004628 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004629
4630 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004631}
4632
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004633VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4634 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004635 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004636 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004637 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004638
Chris Forbes04b61da2016-11-03 09:53:59 +13004639 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004640 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004641
Chris Forbes04b61da2016-11-03 09:53:59 +13004642 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004643 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4644
Chris Forbese58c9fe2016-11-24 14:44:17 +13004645 my_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004646 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004647}
4648
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004649VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Mark Lobodzinskia2d93842017-02-08 16:28:18 -07004650 VkDeviceSize dataSize, const void *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004651 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004652 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004653 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004654
Chris Forbes04b61da2016-11-03 09:53:59 +13004655 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004656
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004657 if (dstOffset & 3) {
Mark Lobodzinski2d9de652017-04-24 08:58:52 -06004658 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07004659 VALIDATION_ERROR_01147, LayerName,
4660 "vkCmdUpdateBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4. %s",
4661 dstOffset, validation_error_map[VALIDATION_ERROR_01147]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004662 }
4663
4664 if ((dataSize <= 0) || (dataSize > 65536)) {
Mark Lobodzinski2d9de652017-04-24 08:58:52 -06004665 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07004666 VALIDATION_ERROR_01148, LayerName, "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4667 "), must be greater than zero and less than or equal to 65536. %s",
4668 dataSize, validation_error_map[VALIDATION_ERROR_01148]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004669 } else if (dataSize & 3) {
Mark Lobodzinski2d9de652017-04-24 08:58:52 -06004670 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07004671 VALIDATION_ERROR_01149, LayerName,
4672 "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4. %s",
4673 dataSize, validation_error_map[VALIDATION_ERROR_01149]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004674 }
4675
Chris Forbes04b61da2016-11-03 09:53:59 +13004676 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004677 my_data->dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004678 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004679}
4680
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004681VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4682 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004683 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004684 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004685 assert(my_data != NULL);
4686
Chris Forbes04b61da2016-11-03 09:53:59 +13004687 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004688
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004689 if (dstOffset & 3) {
Mark Lobodzinski2d9de652017-04-24 08:58:52 -06004690 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07004691 VALIDATION_ERROR_01133, LayerName,
4692 "vkCmdFillBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4. %s",
4693 dstOffset, validation_error_map[VALIDATION_ERROR_01133]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004694 }
4695
4696 if (size != VK_WHOLE_SIZE) {
4697 if (size <= 0) {
Mark Lobodzinski2d9de652017-04-24 08:58:52 -06004698 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4699 __LINE__, VALIDATION_ERROR_01134, LayerName,
Mike Weiblena6666382017-01-05 15:16:11 -07004700 "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero. %s",
4701 size, validation_error_map[VALIDATION_ERROR_01134]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004702 } else if (size & 3) {
Mark Lobodzinski2d9de652017-04-24 08:58:52 -06004703 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4704 __LINE__, VALIDATION_ERROR_01136, LayerName,
Mike Weiblena6666382017-01-05 15:16:11 -07004705 "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4. %s", size,
4706 validation_error_map[VALIDATION_ERROR_01136]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004707 }
4708 }
4709
Chris Forbes04b61da2016-11-03 09:53:59 +13004710 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004711 my_data->dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004712 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004713}
4714
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004715VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4716 const VkClearColorValue *pColor, uint32_t rangeCount,
4717 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004718 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004719 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004720 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004721
Chris Forbes04b61da2016-11-03 09:53:59 +13004722 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004723
Chris Forbes04b61da2016-11-03 09:53:59 +13004724 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004725 my_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004726 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004727}
4728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004729VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4730 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4731 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004732 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004733 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004734 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004735
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004736 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount,
4737 pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004738
Chris Forbes04b61da2016-11-03 09:53:59 +13004739 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004740 my_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004741 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004742}
4743
Chia-I Wu01ca2372016-05-13 14:37:49 +08004744VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4745 const VkClearAttachment *pAttachments, uint32_t rectCount,
4746 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004747 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004748 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004749 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004750
Chris Forbes04b61da2016-11-03 09:53:59 +13004751 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004752
Chris Forbes04b61da2016-11-03 09:53:59 +13004753 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004754 my_data->dispatch_table.CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004755 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004756}
4757
Mike Weiblen37166272017-01-05 15:11:00 -07004758static bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004759 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004760 if (pRegions != nullptr) {
4761 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4762 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4763 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004764 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 -06004765 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004766 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4767 return false;
4768 }
4769 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4770 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4771 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004772 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 -06004773 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004774 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4775 return false;
4776 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004777 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004778
4779 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004780}
4781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004782VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4783 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4784 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004785 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004786 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004787 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004788
Chris Forbes04b61da2016-11-03 09:53:59 +13004789 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004790 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004791
Chris Forbes04b61da2016-11-03 09:53:59 +13004792 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004793 PreCmdResolveImage(commandBuffer, pRegions);
4794
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004795 my_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4796 pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004797 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004798}
4799
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004800VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004801 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004802 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004803 assert(my_data != NULL);
4804
Chris Forbes04b61da2016-11-03 09:53:59 +13004805 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004806
Chris Forbes04b61da2016-11-03 09:53:59 +13004807 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004808 my_data->dispatch_table.CmdSetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004809 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004810}
4811
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004812VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004813 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004814 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004815 assert(my_data != NULL);
4816
Chris Forbes04b61da2016-11-03 09:53:59 +13004817 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004818
Chris Forbes04b61da2016-11-03 09:53:59 +13004819 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004820 my_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004821 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004822}
4823
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004824VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4825 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4826 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4827 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4828 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004829 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004830 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004831 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004832
Chris Forbes04b61da2016-11-03 09:53:59 +13004833 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004834 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4835 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004836
Chris Forbes04b61da2016-11-03 09:53:59 +13004837 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004838 my_data->dispatch_table.CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount,
4839 pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4840 imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004841 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004842}
4843
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004844VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4845 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4846 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4847 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4848 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004849 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004850 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004851 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004852
Chris Forbes04b61da2016-11-03 09:53:59 +13004853 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004854 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4855 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004856
Chris Forbes04b61da2016-11-03 09:53:59 +13004857 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004858 my_data->dispatch_table.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount,
4859 pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4860 imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004861 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004862}
4863
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004864VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4865 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004866 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004867 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004868 assert(my_data != NULL);
4869
Chris Forbes04b61da2016-11-03 09:53:59 +13004870 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004871
Chris Forbes04b61da2016-11-03 09:53:59 +13004872 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004873 my_data->dispatch_table.CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004874 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004875}
4876
Chia-I Wu01ca2372016-05-13 14:37:49 +08004877VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004878 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004879 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004880 assert(my_data != NULL);
4881
Chris Forbes04b61da2016-11-03 09:53:59 +13004882 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004883
Chris Forbes04b61da2016-11-03 09:53:59 +13004884 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004885 my_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004886 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004887}
4888
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004889VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4890 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004891 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004892 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004893 assert(my_data != NULL);
4894
Chris Forbes04b61da2016-11-03 09:53:59 +13004895 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004896
Chris Forbes04b61da2016-11-03 09:53:59 +13004897 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004898 my_data->dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004899 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004900}
4901
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004902bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4903 uint32_t slot) {
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004904 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004905
4906 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004907}
4908
Chia-I Wu01ca2372016-05-13 14:37:49 +08004909VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4910 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004911 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004912 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004913 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004914
Chris Forbes04b61da2016-11-03 09:53:59 +13004915 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004916
Chris Forbes04b61da2016-11-03 09:53:59 +13004917 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004918 my_data->dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004919
4920 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4921 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004922}
4923
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004924VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4925 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4926 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004927 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004928 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004929 assert(my_data != NULL);
4930
Chris Forbes04b61da2016-11-03 09:53:59 +13004931 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004932 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004933
Chris Forbes04b61da2016-11-03 09:53:59 +13004934 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004935 my_data->dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset,
4936 stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004937 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004938}
4939
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004940VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4941 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004942 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004943 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004944 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004945
Chris Forbes04b61da2016-11-03 09:53:59 +13004946 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004947
Chris Forbes04b61da2016-11-03 09:53:59 +13004948 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004949 my_data->dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004950 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004951}
4952
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004953VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4954 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004955 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004956 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004957 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004958
Chris Forbes04b61da2016-11-03 09:53:59 +13004959 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004960
Chris Forbes04b61da2016-11-03 09:53:59 +13004961 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004962 my_data->dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004963 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004964}
4965
Chia-I Wu01ca2372016-05-13 14:37:49 +08004966VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004967 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004968 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves29148ff2016-03-23 19:44:00 -06004969 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004970
Chris Forbes04b61da2016-11-03 09:53:59 +13004971 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004972
Chris Forbes04b61da2016-11-03 09:53:59 +13004973 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004974 my_data->dispatch_table.CmdNextSubpass(commandBuffer, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004975 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004976}
4977
Chia-I Wu01ca2372016-05-13 14:37:49 +08004978VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004979 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004980 my_data->dispatch_table.CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004981}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004982
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004983VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4984 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004985 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004986 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004987 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004988
Chris Forbes04b61da2016-11-03 09:53:59 +13004989 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004990
Chris Forbes04b61da2016-11-03 09:53:59 +13004991 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004992 my_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004993 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004994}
4995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004996VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004997 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4998}
4999
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005000VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5001 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005002 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
5003}
5004
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005005VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5006 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005007 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
5008 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
5009
5010 return VK_ERROR_LAYER_NOT_PRESENT;
5011}
5012
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005013VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
5014 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08005015 /* parameter_validation does not have any physical device extensions */
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005016 if (pLayerName && !strcmp(pLayerName, global_layer.layerName)) return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08005017
5018 assert(physicalDevice);
5019
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005020 return GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map)
Chris Forbes6444bba2016-11-24 14:15:23 +13005021 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005022}
5023
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005024static bool require_device_extension(layer_data *my_data, bool flag, char const *function_name, char const *extension_name) {
Mark Young39389872017-01-19 21:10:49 -07005025 if (!flag) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005026 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
5027 EXTENSION_NOT_ENABLED, LayerName,
5028 "%s() called even though the %s extension was not enabled for this VkDevice.", function_name,
5029 extension_name);
Chris Forbes448ebcb2016-11-03 09:29:52 +13005030 }
5031
5032 return false;
5033}
5034
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005035// WSI Extension Functions
5036
5037VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005038 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005039 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005040 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005041 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005042 assert(my_data != NULL);
5043
Chris Forbes481df4f2017-05-02 14:18:07 -07005044 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain, "vkCreateSwapchainKHR",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005045 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005046
Chris Forbes04b61da2016-11-03 09:53:59 +13005047 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048
Chris Forbes04b61da2016-11-03 09:53:59 +13005049 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005050 result = my_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005051
5052 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
5053 }
5054
5055 return result;
5056}
5057
5058VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005059 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005060 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005061 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005062 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005063 assert(my_data != NULL);
5064
Chris Forbes481df4f2017-05-02 14:18:07 -07005065 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain, "vkGetSwapchainImagesKHR",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005066 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005067
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005068 skip |= parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005069
Chris Forbes04b61da2016-11-03 09:53:59 +13005070 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005071 result = my_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005072
5073 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
5074 }
5075
5076 return result;
5077}
5078
5079VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005080 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005081 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005082 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005083 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005084 assert(my_data != NULL);
5085
Chris Forbes481df4f2017-05-02 14:18:07 -07005086 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain, "vkAcquireNextImageKHR",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005087 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005088
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005089 skip |= parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005090
Chris Forbes04b61da2016-11-03 09:53:59 +13005091 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005092 result = my_data->dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005093
5094 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
5095 }
5096
5097 return result;
5098}
5099
5100VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
5101 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005102 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005103 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005104 assert(my_data != NULL);
5105
Chris Forbes481df4f2017-05-02 14:18:07 -07005106 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain, "vkQueuePresentKHR",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005107 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005108
Chris Forbes04b61da2016-11-03 09:53:59 +13005109 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Tobin Ehlis13e9c142017-01-13 12:13:57 -07005110
5111 if (pPresentInfo && pPresentInfo->pNext) {
5112 // Verify ext struct
5113 struct std_header {
5114 VkStructureType sType;
5115 const void *pNext;
5116 };
5117 std_header *pnext = (std_header *)pPresentInfo->pNext;
5118 while (pnext) {
5119 if (VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR == pnext->sType) {
Chris Forbes481df4f2017-05-02 14:18:07 -07005120 skip |= require_device_extension(my_data, my_data->enables.khr_incremental_present, "vkQueuePresentKHR",
Tobin Ehlis13e9c142017-01-13 12:13:57 -07005121 VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME);
5122 VkPresentRegionsKHR *present_regions = (VkPresentRegionsKHR *)pnext;
5123 if (present_regions->swapchainCount != pPresentInfo->swapchainCount) {
5124 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
5125 __LINE__, INVALID_USAGE, LayerName,
5126 "QueuePresentKHR(): pPresentInfo->swapchainCount has a value of %i"
5127 " but VkPresentRegionsKHR extension swapchainCount is %i. These values must be equal.",
5128 pPresentInfo->swapchainCount, present_regions->swapchainCount);
5129 }
5130 skip |= validate_struct_pnext(my_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->pNext", NULL,
5131 present_regions->pNext, 0, NULL, GeneratedHeaderVersion);
5132 skip |= validate_array(my_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->swapchainCount",
5133 "pCreateInfo->pNext->pRegions", present_regions->swapchainCount, present_regions->pRegions,
5134 true, false);
5135 for (uint32_t i = 0; i < present_regions->swapchainCount; ++i) {
5136 skip |=
5137 validate_array(my_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->pRegions[].rectangleCount",
5138 "pCreateInfo->pNext->pRegions[].pRectangles", present_regions->pRegions[i].rectangleCount,
5139 present_regions->pRegions[i].pRectangles, true, false);
5140 }
5141 }
5142 pnext = (std_header *)pnext->pNext;
5143 }
5144 }
5145
Chris Forbes04b61da2016-11-03 09:53:59 +13005146 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005147 result = my_data->dispatch_table.QueuePresentKHR(queue, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005148
5149 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
5150 }
5151
5152 return result;
5153}
5154
Chris Forbesbe5f5202016-11-02 18:34:25 +13005155VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005156 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005157 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005158 assert(my_data != NULL);
5159
Chris Forbes481df4f2017-05-02 14:18:07 -07005160 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain, "vkDestroySwapchainKHR",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005161 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005162
5163 /* No generated validation function for this call */
5164
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005166 my_data->dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005167 }
5168}
5169
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005170static bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name,
5171 char const *extension_name) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005172 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6be763e2016-11-24 12:42:33 +13005173 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13005174 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5175 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005176 "%s() called even though the %s extension was not enabled for this VkInstance.", function_name,
5177 extension_name);
Chris Forbes115f98c2016-11-03 09:51:48 +13005178 }
5179
5180 return false;
5181}
5182
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005183VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
5184 VkSurfaceKHR surface, VkBool32 *pSupported) {
5185 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005186 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005187 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005188 assert(my_data != NULL);
5189
Chris Forbes04b61da2016-11-03 09:53:59 +13005190 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005191 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005192
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005193 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
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.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005197
5198 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
5199 }
5200
5201 return result;
5202}
5203
5204VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5205 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
5206 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005207 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005208 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005209 assert(my_data != NULL);
5210
Chris Forbes04b61da2016-11-03 09:53:59 +13005211 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005212 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005213
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005214 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
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.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005218
5219 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
5220 }
5221
5222 return result;
5223}
5224
5225VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5226 uint32_t *pSurfaceFormatCount,
5227 VkSurfaceFormatKHR *pSurfaceFormats) {
5228 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005229 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005230 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005231 assert(my_data != NULL);
5232
Chris Forbes04b61da2016-11-03 09:53:59 +13005233 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005234 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005235
Chris Forbes04b61da2016-11-03 09:53:59 +13005236 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005237 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005238
Chris Forbes04b61da2016-11-03 09:53:59 +13005239 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005240 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
5241 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005242
5243 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
5244 }
5245
5246 return result;
5247}
5248
5249VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5250 uint32_t *pPresentModeCount,
5251 VkPresentModeKHR *pPresentModes) {
5252 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005253 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005254 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005255 assert(my_data != NULL);
5256
Chris Forbes04b61da2016-11-03 09:53:59 +13005257 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005258 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005259
Chris Forbes04b61da2016-11-03 09:53:59 +13005260 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005261 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005262
Chris Forbes04b61da2016-11-03 09:53:59 +13005263 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005264 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
5265 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005266
5267 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
5268 }
5269
5270 return result;
5271}
5272
Chris Forbesbe5f5202016-11-02 18:34:25 +13005273VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005274 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005275 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005276
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005277 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled, "vkDestroySurfaceKHR",
5278 VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005279
Chris Forbes04b61da2016-11-03 09:53:59 +13005280 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005281 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005282 }
5283}
5284
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005285#ifdef VK_USE_PLATFORM_WIN32_KHR
5286VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
5287 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5288 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5289
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005290 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005291 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005292 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005293
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005294 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled, "vkCreateWin32SurfaceKHR",
5295 VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005296
Chris Forbes04b61da2016-11-03 09:53:59 +13005297 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005298
Chris Forbes04b61da2016-11-03 09:53:59 +13005299 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005300 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005301 }
5302
5303 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5304
5305 return result;
5306}
Chris Forbes9a083b92016-11-02 16:58:15 +13005307
5308VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005309 uint32_t queueFamilyIndex) {
Chris Forbes9a083b92016-11-02 16:58:15 +13005310 VkBool32 result = false;
5311
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005312 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005313 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005314 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005315
Chris Forbes04b61da2016-11-03 09:53:59 +13005316 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005317 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005318
Chris Forbes7281a502016-11-08 08:45:03 +13005319 // TODO: codegen doesn't produce this function?
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005320 // skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005321
Chris Forbes04b61da2016-11-03 09:53:59 +13005322 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005323 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005324 }
5325
5326 return result;
5327}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005328#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005329
5330#ifdef VK_USE_PLATFORM_XCB_KHR
5331VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5332 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5333 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5334
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005335 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005336 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005337 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005338
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005339 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled, "vkCreateXcbSurfaceKHR",
5340 VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005341
Chris Forbes04b61da2016-11-03 09:53:59 +13005342 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005343
Chris Forbes04b61da2016-11-03 09:53:59 +13005344 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005345 result = my_data->dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005346 }
5347
5348 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5349
5350 return result;
5351}
5352
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005353VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5354 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5355 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005356 VkBool32 result = false;
5357
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005358 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005359 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005360 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005361
Chris Forbes04b61da2016-11-03 09:53:59 +13005362 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005363 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005364
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005365 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection,
5366 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005367
Chris Forbes04b61da2016-11-03 09:53:59 +13005368 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005369 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5370 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005371 }
5372
5373 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005374}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005375#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005376
5377#ifdef VK_USE_PLATFORM_XLIB_KHR
5378VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005379 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005380 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5381
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005382 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005383 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005384 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005385
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005386 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled, "vkCreateXlibSurfaceKHR",
5387 VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005388
Chris Forbes04b61da2016-11-03 09:53:59 +13005389 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005390
Chris Forbes04b61da2016-11-03 09:53:59 +13005391 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005392 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005393 }
5394
5395 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5396
5397 return result;
5398}
5399
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005400VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5401 uint32_t queueFamilyIndex, Display *dpy,
5402 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005403 VkBool32 result = false;
5404
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005405 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005406 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005407 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005408
Chris Forbes04b61da2016-11-03 09:53:59 +13005409 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005410 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005411
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005412 skip |=
5413 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005414
Chris Forbes04b61da2016-11-03 09:53:59 +13005415 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005416 result =
5417 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005418 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005419 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005420}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005421#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005422
5423#ifdef VK_USE_PLATFORM_MIR_KHR
5424VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005425 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005426 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5427
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005428 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005429 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005430 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005431
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005432 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled, "vkCreateMirSurfaceKHR",
5433 VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005434
Chris Forbes04b61da2016-11-03 09:53:59 +13005435 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005436
Chris Forbes04b61da2016-11-03 09:53:59 +13005437 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005438 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005439 }
5440
5441 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5442
5443 return result;
5444}
5445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005446VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5447 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005448 VkBool32 result = false;
5449
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005450 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005451 assert(my_data != NULL);
5452
Chris Forbes04b61da2016-11-03 09:53:59 +13005453 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005454
Chris Forbes04b61da2016-11-03 09:53:59 +13005455 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005456 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes115f98c2016-11-03 09:51:48 +13005457
Chris Forbes04b61da2016-11-03 09:53:59 +13005458 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005459
Chris Forbes04b61da2016-11-03 09:53:59 +13005460 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005461 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005462 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005463 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005464}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005465#endif // VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005466
5467#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5468VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005469 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005470 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5471
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005472 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005473 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005474 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005475
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005476 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled, "vkCreateWaylandSurfaceKHR",
5477 VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Chris Forbes115f98c2016-11-03 09:51:48 +13005478
Chris Forbes04b61da2016-11-03 09:53:59 +13005479 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005480
Chris Forbes04b61da2016-11-03 09:53:59 +13005481 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005482 result = my_data->dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005483 }
5484
5485 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5486
5487 return result;
5488}
5489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005490VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5491 uint32_t queueFamilyIndex,
5492 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005493 VkBool32 result = false;
5494
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005495 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005496 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005497 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005498
Chris Forbes04b61da2016-11-03 09:53:59 +13005499 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005500 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Chris Forbes115f98c2016-11-03 09:51:48 +13005501
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005502 skip |= parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005503
Chris Forbes04b61da2016-11-03 09:53:59 +13005504 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005505 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005506 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005507
5508 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005509}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005510#endif // VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005511
5512#ifdef VK_USE_PLATFORM_ANDROID_KHR
5513VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005514 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005515 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5516
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005517 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005518 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005519 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005520
Mark Young39389872017-01-19 21:10:49 -07005521 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled, "vkCreateAndroidSurfaceKHR",
5522 VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005523
Chris Forbes04b61da2016-11-03 09:53:59 +13005524 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005525
Chris Forbes04b61da2016-11-03 09:53:59 +13005526 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005527 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005528 }
5529
5530 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5531
5532 return result;
5533}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005534#endif // VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005535
Mark Youngead9b932016-09-08 12:28:38 -06005536VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5537 const VkSwapchainCreateInfoKHR *pCreateInfos,
5538 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5539 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005540 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005541 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005542 assert(my_data != NULL);
5543
Chris Forbes481df4f2017-05-02 14:18:07 -07005544 skip |= require_device_extension(my_data, my_data->enables.khr_display_swapchain, "vkCreateSharedSwapchainsKHR",
Mark Young39389872017-01-19 21:10:49 -07005545 VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005546
Chris Forbes04b61da2016-11-03 09:53:59 +13005547 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Young39389872017-01-19 21:10:49 -07005548 pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005549
Chris Forbes04b61da2016-11-03 09:53:59 +13005550 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005551 result = my_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005552
5553 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5554 }
5555
5556 return result;
5557}
5558
Chris Forbes667a5212016-11-03 10:18:35 +13005559VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5560 VkDisplayPropertiesKHR *pProperties) {
5561 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5562 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005563 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005564 assert(my_data != NULL);
5565
5566 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5567 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5568
5569 // No parameter validation function for this call?
5570
5571 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005572 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005573
5574 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5575 }
5576
5577 return result;
5578}
5579
5580VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5581 VkDisplayPlanePropertiesKHR *pProperties) {
5582 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5583 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005584 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005585 assert(my_data != NULL);
5586
5587 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5588 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5589
5590 // No parameter validation function for this call?
5591
5592 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005593 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005594
5595 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5596 }
5597
5598 return result;
5599}
5600
5601VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5602 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5603 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5604 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005605 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005606 assert(my_data != NULL);
5607
5608 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5609 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5610
5611 // No parameter validation function for this call?
5612
5613 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005614 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005615
5616 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5617 }
5618
5619 return result;
5620}
5621
5622VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5623 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5624 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5625 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005626 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005627 assert(my_data != NULL);
5628
5629 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5630 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5631
5632 // No parameter validation function for this call?
5633
5634 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005635 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005636
5637 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5638 }
5639
5640 return result;
5641}
5642
5643VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5644 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5645 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5646 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5647 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005648 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005649 assert(my_data != NULL);
5650
Mark Young39389872017-01-19 21:10:49 -07005651 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled, "vkCreateDisplayModeKHR",
5652 VK_KHR_DISPLAY_EXTENSION_NAME);
Chris Forbes667a5212016-11-03 10:18:35 +13005653
5654 // No parameter validation function for this call?
5655
5656 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005657 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005658
5659 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5660 }
5661
5662 return result;
5663}
5664
5665VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5666 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5667 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5668 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005669 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005670 assert(my_data != NULL);
5671
5672 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5673 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5674
5675 // No parameter validation function for this call?
5676
5677 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005678 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005679
5680 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5681 }
5682
5683 return result;
5684}
5685
5686VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5687 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5688 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5689 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005690 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005691 assert(my_data != NULL);
5692
Mark Young39389872017-01-19 21:10:49 -07005693 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled, "vkCreateDisplayPlaneSurfaceKHR",
5694 VK_KHR_DISPLAY_EXTENSION_NAME);
Chris Forbes667a5212016-11-03 10:18:35 +13005695
5696 // No parameter validation function for this call?
5697
5698 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005699 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005700
5701 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5702 }
5703
5704 return result;
5705}
5706
Mark Young39389872017-01-19 21:10:49 -07005707// Definitions for the VK_KHR_get_physical_device_properties2 extension
5708
5709VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005710 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005711 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005712 assert(my_data != NULL);
5713
Tobin Ehlis3da63962017-02-06 16:44:50 -07005714 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5715 "vkGetPhysicalDeviceFeatures2KHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005716
Tobin Ehlis3da63962017-02-06 16:44:50 -07005717 skip |= parameter_validation_vkGetPhysicalDeviceFeatures2KHR(my_data->report_data, pFeatures);
Mark Young39389872017-01-19 21:10:49 -07005718
Tobin Ehlis3da63962017-02-06 16:44:50 -07005719 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005720 my_data->dispatch_table.GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
5721 }
5722}
5723
5724VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2KHR(VkPhysicalDevice physicalDevice,
5725 VkPhysicalDeviceProperties2KHR *pProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005726 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005727 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005728 assert(my_data != NULL);
5729
Tobin Ehlis3da63962017-02-06 16:44:50 -07005730 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5731 "vkGetPhysicalDeviceProperties2KHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005732
Tobin Ehlis3da63962017-02-06 16:44:50 -07005733 skip |= parameter_validation_vkGetPhysicalDeviceProperties2KHR(my_data->report_data, pProperties);
Mark Young39389872017-01-19 21:10:49 -07005734
Tobin Ehlis3da63962017-02-06 16:44:50 -07005735 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005736 my_data->dispatch_table.GetPhysicalDeviceProperties2KHR(physicalDevice, pProperties);
5737 }
5738}
5739
5740VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2KHR(VkPhysicalDevice physicalDevice, VkFormat format,
5741 VkFormatProperties2KHR *pFormatProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005742 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005743 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005744 assert(my_data != NULL);
5745
Tobin Ehlis3da63962017-02-06 16:44:50 -07005746 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5747 "vkGetPhysicalDeviceFormatProperties2KHR",
5748 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005749
Tobin Ehlis3da63962017-02-06 16:44:50 -07005750 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties2KHR(my_data->report_data, format, pFormatProperties);
Mark Young39389872017-01-19 21:10:49 -07005751
Tobin Ehlis3da63962017-02-06 16:44:50 -07005752 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005753 my_data->dispatch_table.GetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties);
5754 }
5755}
5756
5757VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties2KHR(
5758 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo,
5759 VkImageFormatProperties2KHR *pImageFormatProperties) {
5760 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis3da63962017-02-06 16:44:50 -07005761 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005762 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005763 assert(my_data != NULL);
5764
Tobin Ehlis3da63962017-02-06 16:44:50 -07005765 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5766 "vkGetPhysicalDeviceImageFormatProperties2KHR",
5767 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005768
Tobin Ehlis3da63962017-02-06 16:44:50 -07005769 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties2KHR(my_data->report_data, pImageFormatInfo,
5770 pImageFormatProperties);
Mark Young39389872017-01-19 21:10:49 -07005771
Tobin Ehlis3da63962017-02-06 16:44:50 -07005772 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005773 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo,
5774 pImageFormatProperties);
5775 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties2KHR", result);
5776 }
5777
5778 return result;
5779}
5780
5781VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties2KHR(VkPhysicalDevice physicalDevice,
5782 uint32_t *pQueueFamilyPropertyCount,
5783 VkQueueFamilyProperties2KHR *pQueueFamilyProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005784 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005785 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005786 assert(my_data != NULL);
5787
Tobin Ehlis3da63962017-02-06 16:44:50 -07005788 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5789 "vkGetPhysicalDeviceQueueFamilyProperties2KHR",
5790 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005791
Tobin Ehlis3da63962017-02-06 16:44:50 -07005792 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties2KHR(my_data->report_data, pQueueFamilyPropertyCount,
5793 pQueueFamilyProperties);
Mark Young39389872017-01-19 21:10:49 -07005794
Tobin Ehlis3da63962017-02-06 16:44:50 -07005795 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005796 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount,
5797 pQueueFamilyProperties);
5798 }
5799}
5800
5801VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties2KHR(VkPhysicalDevice physicalDevice,
5802 VkPhysicalDeviceMemoryProperties2KHR *pMemoryProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005803 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005804 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005805 assert(my_data != NULL);
5806
Tobin Ehlis3da63962017-02-06 16:44:50 -07005807 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5808 "vkGetPhysicalDeviceMemoryProperties2KHR",
5809 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005810
Tobin Ehlis3da63962017-02-06 16:44:50 -07005811 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties2KHR(my_data->report_data, pMemoryProperties);
Mark Young39389872017-01-19 21:10:49 -07005812
Tobin Ehlis3da63962017-02-06 16:44:50 -07005813 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005814 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties2KHR(physicalDevice, pMemoryProperties);
5815 }
5816}
5817
Tobin Ehlis3da63962017-02-06 16:44:50 -07005818static bool PostGetPhysicalDeviceSparseImageFormatProperties2KHR(VkPhysicalDevice physicalDevice,
5819 const VkPhysicalDeviceSparseImageFormatInfo2KHR *pFormatInfo,
5820 uint32_t *pPropertyCount,
5821 VkSparseImageFormatProperties2KHR *pProperties) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005822 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Tobin Ehlis3da63962017-02-06 16:44:50 -07005823 if (pProperties != nullptr) {
5824 for (uint32_t i = 0; i < *pPropertyCount; ++i) {
5825 if ((pProperties[i].properties.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5826 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
5827 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
5828 1, LayerName,
5829 "vkGetPhysicalDeviceSparseImageFormatProperties2KHR parameter, VkImageAspect "
5830 "pProperties[%i].properties.aspectMask, is an "
5831 "unrecognized enumerator",
5832 i);
5833 return false;
5834 }
5835 }
5836 }
5837 return true;
5838}
5839
Mark Young39389872017-01-19 21:10:49 -07005840VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties2KHR(
5841 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR *pFormatInfo, uint32_t *pPropertyCount,
5842 VkSparseImageFormatProperties2KHR *pProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005843 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005844 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005845 assert(my_data != NULL);
5846
Tobin Ehlis3da63962017-02-06 16:44:50 -07005847 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5848 "vkGetPhysicalDeviceSparseImageFormatProperties2KHR",
5849 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005850
Tobin Ehlis3da63962017-02-06 16:44:50 -07005851 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties2KHR(my_data->report_data, pFormatInfo,
5852 pPropertyCount, pProperties);
Mark Young39389872017-01-19 21:10:49 -07005853
Tobin Ehlis3da63962017-02-06 16:44:50 -07005854 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005855 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount,
5856 pProperties);
Tobin Ehlis3da63962017-02-06 16:44:50 -07005857 PostGetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
Mark Young39389872017-01-19 21:10:49 -07005858 }
5859}
5860
5861// Definitions for the VK_KHR_maintenance1 extension
5862
5863VKAPI_ATTR void VKAPI_CALL TrimCommandPoolKHR(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005864 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07005865 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005866 assert(my_data != NULL);
5867
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005868 skip |= require_device_extension(my_data, my_data->enables.khr_maintenance1, "vkTrimCommandPoolKHR",
5869 VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005870
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005871 skip |= parameter_validation_vkTrimCommandPoolKHR(my_data->report_data, commandPool, flags);
Mark Young39389872017-01-19 21:10:49 -07005872
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005873 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005874 my_data->dispatch_table.TrimCommandPoolKHR(device, commandPool, flags);
5875 }
5876}
5877
Mark Young0f183a82017-02-28 09:58:04 -07005878// Definitions for the VK_KHR_push_descriptor extension
5879
5880VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
5881 VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount,
5882 const VkWriteDescriptorSet *pDescriptorWrites) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005883 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07005884 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
5885 assert(my_data != NULL);
5886
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005887 skip |= require_device_extension(my_data, my_data->enables.khr_push_descriptor, "vkCmdPushDescriptorSetKHR",
5888 VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07005889
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005890 skip |= parameter_validation_vkCmdPushDescriptorSetKHR(my_data->report_data, pipelineBindPoint, layout, set,
5891 descriptorWriteCount, pDescriptorWrites);
Mark Young0f183a82017-02-28 09:58:04 -07005892
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005893 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07005894 my_data->dispatch_table.CmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount,
5895 pDescriptorWrites);
5896 }
5897}
5898
5899// Definitions for the VK_KHR_descriptor_update_template extension
5900
5901VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplateKHR(VkDevice device,
5902 const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo,
5903 const VkAllocationCallbacks *pAllocator,
5904 VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) {
5905 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005906 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07005907 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
5908 assert(my_data != NULL);
5909
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005910 skip |= require_device_extension(my_data, my_data->enables.khr_descriptor_update_template,
5911 "vkCreateDescriptorUpdateTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07005912
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005913 skip |= parameter_validation_vkCreateDescriptorUpdateTemplateKHR(my_data->report_data, pCreateInfo, pAllocator,
5914 pDescriptorUpdateTemplate);
Mark Young0f183a82017-02-28 09:58:04 -07005915
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005916 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07005917 result =
5918 my_data->dispatch_table.CreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
5919 validate_result(my_data->report_data, "vkCreateDescriptorUpdateTemplateKHR", result);
5920 }
5921
5922 return result;
5923}
5924
5925VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplateKHR(VkDevice device,
5926 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
5927 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005928 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07005929 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
5930 assert(my_data != NULL);
5931
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005932 skip |= require_device_extension(my_data, my_data->enables.khr_descriptor_update_template,
5933 "vkDestroyDescriptorUpdateTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07005934
5935#if 0 // Validation not automatically generated
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005936 skip |= parameter_validation_vkDestroyDescriptorUpdateTemplateKHR(my_data->report_data, descriptorUpdateTemplate,
Mark Young0f183a82017-02-28 09:58:04 -07005937 pAllocator);
5938#endif
5939
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005940 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07005941 my_data->dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator);
5942 }
5943}
5944
5945VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
5946 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
5947 const void *pData) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005948 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07005949 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
5950 assert(my_data != NULL);
5951
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005952 skip |= require_device_extension(my_data, my_data->enables.khr_descriptor_update_template,
5953 "vkUpdateDescriptorSetWithTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07005954
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005955 skip |= parameter_validation_vkUpdateDescriptorSetWithTemplateKHR(my_data->report_data, descriptorSet, descriptorUpdateTemplate,
5956 pData);
Mark Young0f183a82017-02-28 09:58:04 -07005957
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005958 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07005959 my_data->dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData);
5960 }
5961}
5962
5963VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
5964 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
5965 VkPipelineLayout layout, uint32_t set, const void *pData) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005966 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07005967 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
5968 assert(my_data != NULL);
5969
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005970 skip |= require_device_extension(my_data, my_data->enables.khr_descriptor_update_template,
5971 "vkCmdPushDescriptorSetWithTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07005972
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005973 skip |= parameter_validation_vkCmdPushDescriptorSetWithTemplateKHR(my_data->report_data, descriptorUpdateTemplate, layout, set,
5974 pData);
Mark Young0f183a82017-02-28 09:58:04 -07005975
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005976 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07005977 my_data->dispatch_table.CmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData);
5978 }
5979}
5980
5981// Definitions for the VK_KHX_device_group_creation extension
5982
5983VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHX(
5984 VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX *pPhysicalDeviceGroupProperties) {
5985 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005986 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07005987 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
5988 assert(my_data != NULL);
5989
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005990 skip |= require_instance_extension(instance, &instance_extension_enables::khx_device_group_creation_enabled,
5991 "vkEnumeratePhysicalDeviceGroupsKHX", VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07005992
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005993 skip |= parameter_validation_vkEnumeratePhysicalDeviceGroupsKHX(my_data->report_data, pPhysicalDeviceGroupCount,
5994 pPhysicalDeviceGroupProperties);
Mark Young0f183a82017-02-28 09:58:04 -07005995
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06005996 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07005997 result = my_data->dispatch_table.EnumeratePhysicalDeviceGroupsKHX(instance, pPhysicalDeviceGroupCount,
5998 pPhysicalDeviceGroupProperties);
5999 validate_result(my_data->report_data, "vkEnumeratePhysicalDeviceGroupsKHX", result);
6000 }
6001 return result;
6002}
6003
6004// Definitions for the VK_KHX_device_group extension
6005
6006VKAPI_ATTR void VKAPI_CALL GetDeviceGroupPeerMemoryFeaturesKHX(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex,
6007 uint32_t remoteDeviceIndex,
6008 VkPeerMemoryFeatureFlagsKHX *pPeerMemoryFeatures) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006009 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006010 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6011 assert(my_data != NULL);
6012
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006013 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkGetDeviceGroupPeerMemoryFeaturesKHX",
6014 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006015
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006016 skip |= parameter_validation_vkGetDeviceGroupPeerMemoryFeaturesKHX(my_data->report_data, heapIndex, localDeviceIndex,
6017 remoteDeviceIndex, pPeerMemoryFeatures);
Mark Young0f183a82017-02-28 09:58:04 -07006018
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006019 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006020 my_data->dispatch_table.GetDeviceGroupPeerMemoryFeaturesKHX(device, heapIndex, localDeviceIndex, remoteDeviceIndex,
6021 pPeerMemoryFeatures);
6022 }
6023}
6024
6025VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory2KHX(VkDevice device, uint32_t bindInfoCount,
6026 const VkBindBufferMemoryInfoKHX *pBindInfos) {
6027 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006028 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006029 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6030 assert(my_data != NULL);
6031
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006032 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkBindBufferMemory2KHX",
6033 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006034
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006035 skip |= parameter_validation_vkBindBufferMemory2KHX(my_data->report_data, bindInfoCount, pBindInfos);
Mark Young0f183a82017-02-28 09:58:04 -07006036
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006037 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006038 result = my_data->dispatch_table.BindBufferMemory2KHX(device, bindInfoCount, pBindInfos);
6039 validate_result(my_data->report_data, "vkBindBufferMemory2KHX", result);
6040 }
6041
6042 return result;
6043}
6044
6045VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory2KHX(VkDevice device, uint32_t bindInfoCount,
6046 const VkBindImageMemoryInfoKHX *pBindInfos) {
6047 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006048 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006049 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6050 assert(my_data != NULL);
6051
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006052 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkBindImageMemory2KHX",
6053 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006054
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006055 skip |= parameter_validation_vkBindImageMemory2KHX(my_data->report_data, bindInfoCount, pBindInfos);
Mark Young0f183a82017-02-28 09:58:04 -07006056
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006057 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006058 result = my_data->dispatch_table.BindImageMemory2KHX(device, bindInfoCount, pBindInfos);
6059 validate_result(my_data->report_data, "vkBindImageMemory2KHX", result);
6060 }
6061
6062 return result;
6063}
6064
6065VKAPI_ATTR void VKAPI_CALL CmdSetDeviceMaskKHX(VkCommandBuffer commandBuffer, uint32_t deviceMask) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006066 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006067 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6068 assert(my_data != NULL);
6069
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006070 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkCmdSetDeviceMaskKHX",
6071 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006072
6073#if 0 // Validation not automatically generated
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006074 skip |= parameter_validation_vkCmdSetDeviceMaskKHX(my_data->report_data, deviceMask);
Mark Young0f183a82017-02-28 09:58:04 -07006075#endif
6076
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006077 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006078 my_data->dispatch_table.CmdSetDeviceMaskKHX(commandBuffer, deviceMask);
6079 }
6080}
6081
6082VKAPI_ATTR VkResult VKAPI_CALL
6083GetDeviceGroupPresentCapabilitiesKHX(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX *pDeviceGroupPresentCapabilities) {
6084 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006085 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006086 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6087 assert(my_data != NULL);
6088
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006089 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkGetDeviceGroupPresentCapabilitiesKHX",
6090 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006091
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006092 skip |= parameter_validation_vkGetDeviceGroupPresentCapabilitiesKHX(my_data->report_data, pDeviceGroupPresentCapabilities);
Mark Young0f183a82017-02-28 09:58:04 -07006093
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006094 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006095 result = my_data->dispatch_table.GetDeviceGroupPresentCapabilitiesKHX(device, pDeviceGroupPresentCapabilities);
6096 validate_result(my_data->report_data, "vkGetDeviceGroupPresentCapabilitiesKHX", result);
6097 }
6098
6099 return result;
6100}
6101
6102VKAPI_ATTR VkResult VKAPI_CALL GetDeviceGroupSurfacePresentModesKHX(VkDevice device, VkSurfaceKHR surface,
6103 VkDeviceGroupPresentModeFlagsKHX *pModes) {
6104 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006105 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006106 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6107 assert(my_data != NULL);
6108
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006109 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkGetDeviceGroupSurfacePresentModesKHX",
6110 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006111
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006112 skip |= parameter_validation_vkGetDeviceGroupSurfacePresentModesKHX(my_data->report_data, surface, pModes);
Mark Young0f183a82017-02-28 09:58:04 -07006113
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006114 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006115 result = my_data->dispatch_table.GetDeviceGroupSurfacePresentModesKHX(device, surface, pModes);
6116 validate_result(my_data->report_data, "vkGetDeviceGroupSurfacePresentModesKHX", result);
6117 }
6118 return result;
6119}
6120
6121VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImage2KHX(VkDevice device, const VkAcquireNextImageInfoKHX *pAcquireInfo,
6122 uint32_t *pImageIndex) {
6123 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006124 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006125 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6126 assert(my_data != NULL);
6127
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006128 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkAcquireNextImage2KHX",
6129 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006130
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006131 skip |= parameter_validation_vkAcquireNextImage2KHX(my_data->report_data, pAcquireInfo, pImageIndex);
Mark Young0f183a82017-02-28 09:58:04 -07006132
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006133 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006134 result = my_data->dispatch_table.AcquireNextImage2KHX(device, pAcquireInfo, pImageIndex);
6135 validate_result(my_data->report_data, "vkAcquireNextImage2KHX", result);
6136 }
6137 return result;
6138}
6139
6140VKAPI_ATTR void VKAPI_CALL CmdDispatchBaseKHX(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
6141 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
6142 uint32_t groupCountZ) {
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006143 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006144 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6145 assert(my_data != NULL);
6146
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006147 skip |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkCmdDispatchBaseKHX",
6148 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006149
6150#if 0 // Validation not automatically generated
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006151 skip |= parameter_validation_vkCmdDispatchBaseKHX(my_data->report_data, baseGroupX, baseGroupY, baseGroupZ,
Mark Young0f183a82017-02-28 09:58:04 -07006152 groupCountX, groupCountY, groupCountZ);
6153#endif
6154
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006155 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006156 my_data->dispatch_table.CmdDispatchBaseKHX(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY,
6157 groupCountZ);
6158 }
6159}
6160
6161VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDevicePresentRectanglesKHX(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
6162 uint32_t *pRectCount, VkRect2D *pRects) {
6163 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6164 bool skip = false;
6165 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
6166 assert(my_data != NULL);
6167
6168 skip |= parameter_validation_vkGetPhysicalDevicePresentRectanglesKHX(my_data->report_data, surface, pRectCount, pRects);
6169
6170 if (!skip) {
6171 result = my_data->dispatch_table.GetPhysicalDevicePresentRectanglesKHX(physicalDevice, surface, pRectCount, pRects);
6172
6173 validate_result(my_data->report_data, "vkGetPhysicalDevicePresentRectanglesKHX", result);
6174 }
6175
6176 return result;
6177}
6178
6179// Definitions for the VK_KHX_external_memory_capabilities extension
6180
6181VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceExternalBufferPropertiesKHX(
6182 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHX *pExternalBufferInfo,
6183 VkExternalBufferPropertiesKHX *pExternalBufferProperties) {
6184 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
6185 assert(my_data != NULL);
6186 bool skip = false;
6187 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khx_external_memory_capabilities_enabled,
6188 "vkGetPhysicalDeviceExternalBufferPropertiesKHX",
6189 VK_KHX_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
6190 skip |= parameter_validation_vkGetPhysicalDeviceExternalBufferPropertiesKHX(my_data->report_data, pExternalBufferInfo,
6191 pExternalBufferProperties);
6192 if (!skip) {
6193 my_data->dispatch_table.GetPhysicalDeviceExternalBufferPropertiesKHX(physicalDevice, pExternalBufferInfo,
6194 pExternalBufferProperties);
6195 }
6196}
6197
Mark Young0f183a82017-02-28 09:58:04 -07006198// Definitions for the VK_KHX_external_memory_fd extension
6199
6200VKAPI_ATTR VkResult VKAPI_CALL GetMemoryFdKHX(VkDevice device, VkDeviceMemory memory,
6201 VkExternalMemoryHandleTypeFlagBitsKHX handleType, int *pFd) {
6202 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006203 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006204 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6205 assert(my_data != NULL);
6206
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006207 skip |= require_device_extension(my_data, my_data->enables.khx_external_memory_fd, "vkGetMemoryFdKHX",
6208 VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006209
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006210 skip |= parameter_validation_vkGetMemoryFdKHX(my_data->report_data, memory, handleType, pFd);
Mark Young0f183a82017-02-28 09:58:04 -07006211
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006212 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006213 result = my_data->dispatch_table.GetMemoryFdKHX(device, memory, handleType, pFd);
6214 validate_result(my_data->report_data, "vkGetMemoryFdKHX", result);
6215 }
6216
6217 return result;
6218}
6219
6220VKAPI_ATTR VkResult VKAPI_CALL GetMemoryFdPropertiesKHX(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHX handleType, int fd,
6221 VkMemoryFdPropertiesKHX *pMemoryFdProperties) {
6222 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006223 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006224 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6225 assert(my_data != NULL);
6226
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006227 skip |= require_device_extension(my_data, my_data->enables.khx_external_memory_fd, "vkGetMemoryFdPropertiesKHX",
6228 VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006229
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006230 skip |= parameter_validation_vkGetMemoryFdPropertiesKHX(my_data->report_data, handleType, fd, pMemoryFdProperties);
Mark Young0f183a82017-02-28 09:58:04 -07006231
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006232 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006233 result = my_data->dispatch_table.GetMemoryFdPropertiesKHX(device, handleType, fd, pMemoryFdProperties);
6234 validate_result(my_data->report_data, "vkGetMemoryFdPropertiesKHX", result);
6235 }
6236
6237 return result;
6238}
6239
6240// Definitions for the VK_KHX_external_memory_win32 extension
6241
6242#ifdef VK_USE_PLATFORM_WIN32_KHX
6243VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleKHX(VkDevice device, VkDeviceMemory memory,
6244 VkExternalMemoryHandleTypeFlagBitsKHX handleType, HANDLE *pHandle) {
6245 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006246 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006247 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6248 assert(my_data != NULL);
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006249 skip |= require_device_extension(my_data, my_data->enables.khx_external_memory_win32, "vkGetMemoryWin32HandleKHX",
6250 VK_KHX_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006251
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006252 skip |= parameter_validation_vkGetMemoryWin32HandleKHX(my_data->report_data, memory, handleType, pHandle);
Mark Young0f183a82017-02-28 09:58:04 -07006253
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006254 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006255 result = my_data->dispatch_table.GetMemoryWin32HandleKHX(device, memory, handleType, pHandle);
6256 validate_result(my_data->report_data, "vkGetMemoryWin32HandleKHX", result);
6257 }
6258 return result;
6259}
6260
6261VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandlePropertiesKHX(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHX handleType,
6262 HANDLE handle,
6263 VkMemoryWin32HandlePropertiesKHX *pMemoryWin32HandleProperties) {
6264 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006265 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006266 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6267 assert(my_data != NULL);
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006268 skip |= require_device_extension(my_data, my_data->enables.khx_external_memory_win32, "vkGetMemoryWin32HandlePropertiesKHX",
6269 VK_KHX_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006270
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006271 skip |= parameter_validation_vkGetMemoryWin32HandlePropertiesKHX(my_data->report_data, handleType, handle,
6272 pMemoryWin32HandleProperties);
Mark Young0f183a82017-02-28 09:58:04 -07006273
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006274 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006275 result =
6276 my_data->dispatch_table.GetMemoryWin32HandlePropertiesKHX(device, handleType, handle, pMemoryWin32HandleProperties);
6277 validate_result(my_data->report_data, "vkGetMemoryWin32HandlePropertiesKHX", result);
6278 }
6279 return result;
6280}
6281#endif // VK_USE_PLATFORM_WIN32_KHX
6282
6283// Definitions for the VK_KHX_external_semaphore_capabilities extension
6284
6285VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceExternalSemaphorePropertiesKHX(
6286 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHX *pExternalSemaphoreInfo,
6287 VkExternalSemaphorePropertiesKHX *pExternalSemaphoreProperties) {
6288 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
6289 assert(my_data != NULL);
6290 bool skip = false;
6291 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khx_external_memory_capabilities_enabled,
6292 "vkGetPhysicalDeviceExternalSemaphorePropertiesKHX",
6293 VK_KHX_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME);
6294 skip |= parameter_validation_vkGetPhysicalDeviceExternalSemaphorePropertiesKHX(my_data->report_data, pExternalSemaphoreInfo,
6295 pExternalSemaphoreProperties);
6296 if (!skip) {
6297 my_data->dispatch_table.GetPhysicalDeviceExternalSemaphorePropertiesKHX(physicalDevice, pExternalSemaphoreInfo,
6298 pExternalSemaphoreProperties);
6299 }
6300}
6301
6302// Definitions for the VK_KHX_external_semaphore_fd extension
6303
6304VKAPI_ATTR VkResult VKAPI_CALL ImportSemaphoreFdKHX(VkDevice device, const VkImportSemaphoreFdInfoKHX *pImportSemaphoreFdInfo) {
6305 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006306 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006307 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6308 assert(my_data != NULL);
6309
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006310 skip |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_fd, "vkImportSemaphoreFdKHX",
6311 VK_KHX_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006312
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006313 skip |= parameter_validation_vkImportSemaphoreFdKHX(my_data->report_data, pImportSemaphoreFdInfo);
Mark Young0f183a82017-02-28 09:58:04 -07006314
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006315 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006316 result = my_data->dispatch_table.ImportSemaphoreFdKHX(device, pImportSemaphoreFdInfo);
6317 validate_result(my_data->report_data, "vkImportSemaphoreFdKHX", result);
6318 }
6319
6320 return result;
6321}
6322
6323VKAPI_ATTR VkResult VKAPI_CALL GetSemaphoreFdKHX(VkDevice device, VkSemaphore semaphore,
6324 VkExternalSemaphoreHandleTypeFlagBitsKHX handleType, int *pFd) {
6325 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006326 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006327 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6328 assert(my_data != NULL);
6329
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006330 skip |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_fd, "vkGetSemaphoreFdKHX",
6331 VK_KHX_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006332
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006333 skip |= parameter_validation_vkGetSemaphoreFdKHX(my_data->report_data, semaphore, handleType, pFd);
Mark Young0f183a82017-02-28 09:58:04 -07006334
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006335 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006336 result = my_data->dispatch_table.GetSemaphoreFdKHX(device, semaphore, handleType, pFd);
6337 validate_result(my_data->report_data, "vkGetSemaphoreFdKHX", result);
6338 }
6339
6340 return result;
6341}
6342
6343// Definitions for the VK_KHX_external_semaphore_win32 extension
6344
6345#ifdef VK_USE_PLATFORM_WIN32_KHX
6346VKAPI_ATTR VkResult VKAPI_CALL
6347ImportSemaphoreWin32HandleKHX(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHX *pImportSemaphoreWin32HandleInfo) {
6348 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006349 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006350 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6351 assert(my_data != NULL);
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006352 skip |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_win32, "vkImportSemaphoreWin32HandleKHX",
6353 VK_KHX_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME);
Mark Young0f183a82017-02-28 09:58:04 -07006354
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006355 skip |= parameter_validation_vkImportSemaphoreWin32HandleKHX(my_data->report_data, pImportSemaphoreWin32HandleInfo);
6356 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006357 result = my_data->dispatch_table.ImportSemaphoreWin32HandleKHX(device, pImportSemaphoreWin32HandleInfo);
6358 validate_result(my_data->report_data, "vkImportSemaphoreWin32HandleKHX", result);
6359 }
6360 return result;
6361}
6362
6363VKAPI_ATTR VkResult VKAPI_CALL GetSemaphoreWin32HandleKHX(VkDevice device, VkSemaphore semaphore,
6364 VkExternalSemaphoreHandleTypeFlagBitsKHX handleType, HANDLE *pHandle) {
6365 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006366 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006367 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6368 assert(my_data != NULL);
Mark Lobodzinskibdc3b022017-04-24 09:11:35 -06006369 skip |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_win32, "vkGetSemaphoreWin32HandleKHX",
6370 VK_KHX_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME);
6371 skip |= parameter_validation_vkGetSemaphoreWin32HandleKHX(my_data->report_data, semaphore, handleType, pHandle);
6372 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07006373 result = my_data->dispatch_table.GetSemaphoreWin32HandleKHX(device, semaphore, handleType, pHandle);
6374 validate_result(my_data->report_data, "vkGetSemaphoreWin32HandleKHX", result);
6375 }
6376 return result;
6377}
6378#endif // VK_USE_PLATFORM_WIN32_KHX
6379
Mark Young39389872017-01-19 21:10:49 -07006380// Definitions for the VK_EXT_acquire_xlib_display extension
6381
6382#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
6383VKAPI_ATTR VkResult VKAPI_CALL AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, VkDisplayKHR display) {
Mark Young39389872017-01-19 21:10:49 -07006384 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006385 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006386 assert(my_data != NULL);
6387 bool skip = false;
6388 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_acquire_xlib_display_enabled,
6389 "vkAcquireXlibDisplayEXT", VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME);
6390 skip |= parameter_validation_vkAcquireXlibDisplayEXT(my_data->report_data, dpy, display);
6391 if (!skip) {
6392 result = my_data->dispatch_table.AcquireXlibDisplayEXT(physicalDevice, dpy, display);
6393 validate_result(my_data->report_data, "vkAcquireXlibDisplayEXT", result);
6394 }
6395 return result;
6396}
6397
6398VKAPI_ATTR VkResult VKAPI_CALL GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, RROutput rrOutput,
6399 VkDisplayKHR *pDisplay) {
Mark Young39389872017-01-19 21:10:49 -07006400 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006401 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006402 assert(my_data != NULL);
6403 bool skip = false;
6404 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_acquire_xlib_display_enabled,
6405 "vkGetRandROutputDisplayEXT", VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME);
6406 skip |= parameter_validation_vkGetRandROutputDisplayEXT(my_data->report_data, dpy, rrOutput, pDisplay);
6407 if (!skip) {
6408 result = my_data->dispatch_table.GetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay);
6409 validate_result(my_data->report_data, "vkGetRandROutputDisplayEXT", result);
6410 }
6411 return result;
6412}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006413#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
Mark Young39389872017-01-19 21:10:49 -07006414
6415// Definitions for the VK_EXT_debug_marker Extension
6416
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006417VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
6418 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006419 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006420 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006421 assert(my_data != NULL);
6422
Mark Young39389872017-01-19 21:10:49 -07006423 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkDebugMarkerSetObjectTagEXT",
6424 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6425
Chris Forbes04b61da2016-11-03 09:53:59 +13006426 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006427
Chris Forbes04b61da2016-11-03 09:53:59 +13006428 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006429 if (my_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
6430 result = my_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
6431 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
6432 } else {
6433 result = VK_SUCCESS;
6434 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006435 }
6436
6437 return result;
6438}
6439
6440VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
6441 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006442 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006443 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006444 assert(my_data != NULL);
6445
Mark Young39389872017-01-19 21:10:49 -07006446 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkDebugMarkerSetObjectNameEXT",
6447 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6448
Chris Forbes04b61da2016-11-03 09:53:59 +13006449 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006450
Chris Forbes04b61da2016-11-03 09:53:59 +13006451 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006452 if (my_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
6453 result = my_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
6454 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
6455 } else {
6456 result = VK_SUCCESS;
6457 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006458 }
6459
6460 return result;
6461}
6462
6463VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13006464 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006465 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006466 assert(my_data != NULL);
6467
Mark Young39389872017-01-19 21:10:49 -07006468 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkCmdDebugMarkerBeginEXT",
6469 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6470
Chris Forbes04b61da2016-11-03 09:53:59 +13006471 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006472
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006473 if (!skip && my_data->dispatch_table.CmdDebugMarkerBeginEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13006474 my_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006475 }
6476}
6477
6478VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13006479 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006480 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006481 assert(my_data != NULL);
6482
Mark Young39389872017-01-19 21:10:49 -07006483 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkCmdDebugMarkerInsertEXT",
6484 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6485
Chris Forbes04b61da2016-11-03 09:53:59 +13006486 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006487
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006488 if (!skip && my_data->dispatch_table.CmdDebugMarkerInsertEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13006489 my_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006490 }
6491}
6492
Mark Young39389872017-01-19 21:10:49 -07006493// Definitions for the VK_EXT_direct_mode_display extension
6494
6495VKAPI_ATTR VkResult VKAPI_CALL ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
Mark Young39389872017-01-19 21:10:49 -07006496 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006497 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006498 assert(my_data != NULL);
6499 bool skip = false;
6500 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_direct_mode_display_enabled,
6501 "vkReleaseDisplayEXT", VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006502#if 0 // Validation not automatically generated
Mark Young39389872017-01-19 21:10:49 -07006503 skip |= parameter_validation_vkReleaseDisplayEXT(my_data->report_data, display);
6504#endif
6505 if (!skip) {
6506 result = my_data->dispatch_table.ReleaseDisplayEXT(physicalDevice, display);
6507 validate_result(my_data->report_data, "vkGetRandROutputDisplayEXT", result);
6508 }
6509 return result;
6510}
6511
Mark Young0f183a82017-02-28 09:58:04 -07006512// Definitions for the VK_EXT_discard_rectangles extension
6513
6514VKAPI_ATTR void VKAPI_CALL CmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
6515 uint32_t discardRectangleCount, const VkRect2D *pDiscardRectangles) {
6516 bool skip = false;
6517 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6518 assert(my_data != NULL);
6519
6520 skip |= require_device_extension(my_data, my_data->enables.ext_discard_rectangles, "vkCmdSetDiscardRectangleEXT",
6521 VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME);
6522
6523 skip |= parameter_validation_vkCmdSetDiscardRectangleEXT(my_data->report_data, firstDiscardRectangle,
6524 discardRectangleCount, pDiscardRectangles);
6525
6526 if (!skip && my_data->dispatch_table.CmdSetDiscardRectangleEXT) {
6527 my_data->dispatch_table.CmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount,
6528 pDiscardRectangles);
6529 }
6530}
6531
6532// Definitions for the VK_EXT_display_control extension
6533
6534VKAPI_ATTR VkResult VKAPI_CALL DisplayPowerControlEXT(VkDevice device, VkDisplayKHR display,
6535 const VkDisplayPowerInfoEXT *pDisplayPowerInfo) {
6536 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6537 bool skip = false;
6538 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6539 assert(my_data != NULL);
6540
6541 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkDisplayPowerControlEXT",
6542 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6543
6544 skip |= parameter_validation_vkDisplayPowerControlEXT(my_data->report_data, display, pDisplayPowerInfo);
6545
6546 if (!skip) {
6547 if (my_data->dispatch_table.DisplayPowerControlEXT) {
6548 result = my_data->dispatch_table.DisplayPowerControlEXT(device, display, pDisplayPowerInfo);
6549 validate_result(my_data->report_data, "vkDisplayPowerControlEXT", result);
6550 } else {
6551 result = VK_SUCCESS;
6552 }
6553 }
6554
6555 return result;
6556}
6557
6558VKAPI_ATTR VkResult VKAPI_CALL RegisterDeviceEventEXT(VkDevice device, const VkDeviceEventInfoEXT *pDeviceEventInfo,
6559 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
6560 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6561 bool skip = false;
6562 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6563 assert(my_data != NULL);
6564
6565 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkRegisterDeviceEventEXT",
6566 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6567
6568 skip |= parameter_validation_vkRegisterDeviceEventEXT(my_data->report_data, pDeviceEventInfo, pAllocator, pFence);
6569
6570 if (!skip) {
6571 if (my_data->dispatch_table.RegisterDeviceEventEXT) {
6572 result = my_data->dispatch_table.RegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence);
6573 validate_result(my_data->report_data, "vkRegisterDeviceEventEXT", result);
6574 } else {
6575 result = VK_SUCCESS;
6576 }
6577 }
6578
6579 return result;
6580}
6581
6582VKAPI_ATTR VkResult VKAPI_CALL RegisterDisplayEventEXT(VkDevice device, VkDisplayKHR display,
6583 const VkDisplayEventInfoEXT *pDisplayEventInfo,
6584 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
6585 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6586 bool skip = false;
6587 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6588 assert(my_data != NULL);
6589
6590 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkRegisterDisplayEventEXT",
6591 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6592
6593 skip |= parameter_validation_vkRegisterDisplayEventEXT(my_data->report_data, display, pDisplayEventInfo, pAllocator, pFence);
6594
6595 if (!skip) {
6596 if (my_data->dispatch_table.RegisterDisplayEventEXT) {
6597 result = my_data->dispatch_table.RegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence);
6598 validate_result(my_data->report_data, "vkRegisterDisplayEventEXT", result);
6599 } else {
6600 result = VK_SUCCESS;
6601 }
6602 }
6603
6604 return result;
6605}
6606
6607VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainCounterEXT(VkDevice device, VkSwapchainKHR swapchain,
6608 VkSurfaceCounterFlagBitsEXT counter, uint64_t *pCounterValue) {
6609 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6610 bool skip = false;
6611 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6612 assert(my_data != NULL);
6613
6614 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkGetSwapchainCounterEXT",
6615 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6616
6617 skip |= parameter_validation_vkGetSwapchainCounterEXT(my_data->report_data, swapchain, counter, pCounterValue);
6618
6619 if (!skip) {
6620 if (my_data->dispatch_table.GetSwapchainCounterEXT) {
6621 result = my_data->dispatch_table.GetSwapchainCounterEXT(device, swapchain, counter, pCounterValue);
6622 validate_result(my_data->report_data, "vkGetSwapchainCounterEXT", result);
6623 } else {
6624 result = VK_SUCCESS;
6625 }
6626 }
6627
6628 return result;
6629}
6630
6631// Definitions for the VK_AMD_draw_indirect_count extension
6632
6633VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
6634 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
6635 uint32_t stride) {
6636 bool skip = false;
6637 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6638 assert(my_data != NULL);
6639 skip |= require_device_extension(my_data, my_data->enables.amd_draw_indirect_count, "vkCmdDrawIndirectCountAMD",
6640 VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6641 skip |= parameter_validation_vkCmdDrawIndirectCountAMD(my_data->report_data, buffer, offset, countBuffer, countBufferOffset,
6642 maxDrawCount, stride);
6643 if (!skip) {
6644 my_data->dispatch_table.CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
6645 stride);
6646 }
6647}
6648
6649VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
6650 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
6651 uint32_t maxDrawCount, uint32_t stride) {
6652 bool skip = false;
6653 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6654 assert(my_data != NULL);
6655 skip |= require_device_extension(my_data, my_data->enables.amd_draw_indirect_count, "vkCmdDrawIndexedIndirectCountAMD",
6656 VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6657 skip |= parameter_validation_vkCmdDrawIndexedIndirectCountAMD(my_data->report_data, buffer, offset, countBuffer,
6658 countBufferOffset, maxDrawCount, stride);
6659 if (!skip) {
6660 my_data->dispatch_table.CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
6661 maxDrawCount, stride);
6662 }
6663}
6664
Mark Young39389872017-01-19 21:10:49 -07006665// Definitions for the VK_EXT_display_surface_counter extension
6666
6667VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
6668 VkSurfaceCapabilities2EXT *pSurfaceCapabilities) {
Mark Young39389872017-01-19 21:10:49 -07006669 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006670 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006671 assert(my_data != NULL);
6672 bool skip = false;
6673 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_display_surface_counter_enabled,
6674 "vkGetPhysicalDeviceSurfaceCapabilities2EXT", VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07006675 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceCapabilities2EXT(my_data->report_data, surface, pSurfaceCapabilities);
Mark Young39389872017-01-19 21:10:49 -07006676 if (!skip) {
6677 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities);
6678 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilities2EXT", result);
6679 }
6680 return result;
6681}
6682
Mark Young0f183a82017-02-28 09:58:04 -07006683// Definitions for the VK_NV_clip_space_w_scaling Extension
6684
6685VKAPI_ATTR void VKAPI_CALL CmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
6686 const VkViewportWScalingNV *pViewportWScalings) {
6687 bool skip = false;
6688 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6689 assert(my_data != NULL);
6690 skip |= require_device_extension(my_data, my_data->enables.amd_draw_indirect_count, "vkCmdSetViewportWScalingNV",
6691 VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6692#if 0 // Validation not automatically generated
6693 skip |= parameter_validation_vkCmdSetViewportWScalingNV(my_data->report_data, firstViewport, viewportCount, pViewportWScalings);
6694#endif
6695 if (!skip) {
6696 my_data->dispatch_table.CmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings);
6697 }
6698}
6699
Mark Young39389872017-01-19 21:10:49 -07006700// Definitions for the VK_NV_external_memory_capabilities Extension
6701
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006702VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
6703 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
6704 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
6705 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006706 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006707 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006708 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006709 assert(my_data != NULL);
6710
Mark Young39389872017-01-19 21:10:49 -07006711 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::nv_external_memory_capabilities_enabled,
6712 "vkGetPhysicalDeviceExternalImageFormatPropertiesNV",
6713 VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
6714
Chris Forbes04b61da2016-11-03 09:53:59 +13006715 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006716 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
6717
Chris Forbes04b61da2016-11-03 09:53:59 +13006718 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13006719 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
6720 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006721
6722 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
6723 }
6724
6725 return result;
6726}
6727
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006728// VK_NV_external_memory_win32 Extension
Mark Young39389872017-01-19 21:10:49 -07006729
6730#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006731VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
6732 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006733 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006734 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006735 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006736 assert(my_data != NULL);
6737
Mark Young39389872017-01-19 21:10:49 -07006738 skip |= require_device_extension(my_data, my_data->enables.nv_external_memory_win32, "vkGetMemoryWin32HandleNV",
6739 VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
6740
Chris Forbes04b61da2016-11-03 09:53:59 +13006741 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006742
Chris Forbes04b61da2016-11-03 09:53:59 +13006743 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13006744 result = my_data->dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006745 }
6746
6747 return result;
6748}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006749#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006750
Mark Young39389872017-01-19 21:10:49 -07006751// VK_NVX_device_generated_commands Extension
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006752
Mark Youngfa552782016-12-12 16:14:55 -07006753VKAPI_ATTR void VKAPI_CALL CmdProcessCommandsNVX(VkCommandBuffer commandBuffer,
6754 const VkCmdProcessCommandsInfoNVX *pProcessCommandsInfo) {
6755 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006756 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006757 assert(my_data != NULL);
6758 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCmdProcessCommandsNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006759 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07006760 skip |= parameter_validation_vkCmdProcessCommandsNVX(my_data->report_data, pProcessCommandsInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006761 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07006762 my_data->dispatch_table.CmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006763 }
6764}
6765
6766VKAPI_ATTR void VKAPI_CALL CmdReserveSpaceForCommandsNVX(VkCommandBuffer commandBuffer,
6767 const VkCmdReserveSpaceForCommandsInfoNVX *pReserveSpaceInfo) {
6768 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006769 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006770 assert(my_data != NULL);
6771 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCmdReserveSpaceForCommandsNVX",
6772 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6773 skip |= parameter_validation_vkCmdReserveSpaceForCommandsNVX(my_data->report_data, pReserveSpaceInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006774 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07006775 my_data->dispatch_table.CmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006776 }
6777}
6778
6779VKAPI_ATTR VkResult VKAPI_CALL CreateIndirectCommandsLayoutNVX(VkDevice device,
6780 const VkIndirectCommandsLayoutCreateInfoNVX *pCreateInfo,
6781 const VkAllocationCallbacks *pAllocator,
6782 VkIndirectCommandsLayoutNVX *pIndirectCommandsLayout) {
6783 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6784 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006785 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006786 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006787 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCreateIndirectCommandsLayoutNVX",
6788 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Youngfa552782016-12-12 16:14:55 -07006789 skip |= parameter_validation_vkCreateIndirectCommandsLayoutNVX(my_data->report_data, pCreateInfo, pAllocator,
6790 pIndirectCommandsLayout);
6791 if (!skip) {
6792 result = my_data->dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
Mark Youngfa552782016-12-12 16:14:55 -07006793 validate_result(my_data->report_data, "vkCreateIndirectCommandsLayoutNVX", result);
6794 }
6795 return result;
6796}
6797
6798VKAPI_ATTR void VKAPI_CALL DestroyIndirectCommandsLayoutNVX(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout,
6799 const VkAllocationCallbacks *pAllocator) {
6800 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006801 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006802 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006803 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkDestroyIndirectCommandsLayoutNVX",
6804 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006805#if 0 // Validation not automatically generated
Mark Youngfa552782016-12-12 16:14:55 -07006806 skip |= parameter_validation_vkDestroyIndirectCommandsLayoutNVX(my_data->report_data, indirectCommandsLayout, pAllocator);
Mark Young39389872017-01-19 21:10:49 -07006807#endif
Mark Youngfa552782016-12-12 16:14:55 -07006808 if (!skip) {
6809 my_data->dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
6810 }
6811}
6812
6813VKAPI_ATTR VkResult VKAPI_CALL CreateObjectTableNVX(VkDevice device, const VkObjectTableCreateInfoNVX *pCreateInfo,
6814 const VkAllocationCallbacks *pAllocator, VkObjectTableNVX *pObjectTable) {
6815 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6816 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006817 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006818 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006819 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCreateObjectTableNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006820 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6821 skip |= parameter_validation_vkCreateObjectTableNVX(my_data->report_data, pCreateInfo, pAllocator, pObjectTable);
6822 if (!skip) {
6823 result = my_data->dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
Mark Young39389872017-01-19 21:10:49 -07006824 validate_result(my_data->report_data, "vkCreateObjectTableNVX", result);
Mark Youngfa552782016-12-12 16:14:55 -07006825 }
6826 return result;
6827}
6828
6829VKAPI_ATTR void VKAPI_CALL DestroyObjectTableNVX(VkDevice device, VkObjectTableNVX objectTable,
6830 const VkAllocationCallbacks *pAllocator) {
6831 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006832 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006833 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006834 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkDestroyObjectTableNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006835 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006836#if 0 // Validation not automatically generated
Mark Youngfa552782016-12-12 16:14:55 -07006837 skip |= parameter_validation_vkDestroyObjectTableNVX(my_data->report_data, objectTable, pAllocator);
Mark Young39389872017-01-19 21:10:49 -07006838#endif
Mark Youngfa552782016-12-12 16:14:55 -07006839 if (!skip) {
6840 my_data->dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator);
6841 }
6842}
6843
6844VKAPI_ATTR VkResult VKAPI_CALL RegisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
6845 const VkObjectTableEntryNVX *const *ppObjectTableEntries,
6846 const uint32_t *pObjectIndices) {
6847 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6848 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006849 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006850 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006851 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkRegisterObjectsNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006852 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6853 skip |= parameter_validation_vkRegisterObjectsNVX(my_data->report_data, objectTable, objectCount, ppObjectTableEntries,
6854 pObjectIndices);
6855 if (!skip) {
6856 result = my_data->dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
Mark Young39389872017-01-19 21:10:49 -07006857 validate_result(my_data->report_data, "vkRegisterObjectsNVX", result);
Mark Youngfa552782016-12-12 16:14:55 -07006858 }
6859 return result;
6860}
6861
6862VKAPI_ATTR VkResult VKAPI_CALL UnregisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
6863 const VkObjectEntryTypeNVX *pObjectEntryTypes, const uint32_t *pObjectIndices) {
6864 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6865 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006866 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006867 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006868 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkUnregisterObjectsNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006869 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6870 skip |= parameter_validation_vkUnregisterObjectsNVX(my_data->report_data, objectTable, objectCount, pObjectEntryTypes,
6871 pObjectIndices);
6872 if (!skip) {
6873 result = my_data->dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
Mark Young39389872017-01-19 21:10:49 -07006874 validate_result(my_data->report_data, "vkUnregisterObjectsNVX", result);
Mark Youngfa552782016-12-12 16:14:55 -07006875 }
6876 return result;
6877}
6878
6879VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceGeneratedCommandsPropertiesNVX(VkPhysicalDevice physicalDevice,
6880 VkDeviceGeneratedCommandsFeaturesNVX *pFeatures,
6881 VkDeviceGeneratedCommandsLimitsNVX *pLimits) {
6882 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006883 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006884 assert(my_data != NULL);
Mark Youngfa552782016-12-12 16:14:55 -07006885 skip |= parameter_validation_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(my_data->report_data, pFeatures, pLimits);
Mark Youngfa552782016-12-12 16:14:55 -07006886 if (!skip) {
6887 my_data->dispatch_table.GetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
6888 }
6889}
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006890
Mark Lobodzinski1d218cc2017-03-14 10:12:43 -06006891VKAPI_ATTR VkResult VKAPI_CALL GetPastPresentationTimingGOOGLE(VkDevice device, VkSwapchainKHR swapchain,
6892 uint32_t *pPresentationTimingCount,
6893 VkPastPresentationTimingGOOGLE *pPresentationTimings) {
6894 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6895 bool skip = false;
6896 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6897 assert(my_data != NULL);
6898 skip |= parameter_validation_vkGetPastPresentationTimingGOOGLE(my_data->report_data, swapchain, pPresentationTimingCount,
6899 pPresentationTimings);
6900 if (!skip) {
6901 result = my_data->dispatch_table.GetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount,
6902 pPresentationTimings);
6903 }
6904 return result;
6905}
6906
6907VKAPI_ATTR VkResult VKAPI_CALL GetRefreshCycleDurationGOOGLE(VkDevice device, VkSwapchainKHR swapchain,
6908 VkRefreshCycleDurationGOOGLE *pDisplayTimingProperties) {
6909 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6910 bool skip = false;
6911 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6912 assert(my_data != NULL);
6913 skip |= parameter_validation_vkGetRefreshCycleDurationGOOGLE(my_data->report_data, swapchain, pDisplayTimingProperties);
6914 if (!skip) {
6915 result = my_data->dispatch_table.GetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
6916 }
6917 return result;
6918}
6919
6920VKAPI_ATTR void VKAPI_CALL SetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR *pSwapchains,
6921 const VkHdrMetadataEXT *pMetadata) {
6922 bool skip = false;
6923 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6924 assert(my_data != NULL);
6925 skip |= parameter_validation_vkSetHdrMetadataEXT(my_data->report_data, swapchainCount, pSwapchains, pMetadata);
6926 if (!skip) {
6927 my_data->dispatch_table.SetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
6928 }
6929}
6930
Mark Young4e423c02017-03-07 13:09:00 -07006931static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) {
6932 for (unsigned int i = 0; i < sizeof(procmap) / sizeof(procmap[0]); i++) {
6933 if (!strcmp(name, procmap[i].name)) return procmap[i].pFunc;
6934 }
6935 return NULL;
6936}
Mark Young39389872017-01-19 21:10:49 -07006937
Chia-I Wu01ca2372016-05-13 14:37:49 +08006938VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08006939 assert(device);
6940
Mark Young4e423c02017-03-07 13:09:00 -07006941 PFN_vkVoidFunction addr = layer_intercept_proc(funcName);
6942 if (addr) return addr;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07006943
Mark Young4e423c02017-03-07 13:09:00 -07006944 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07006945
Mark Young4e423c02017-03-07 13:09:00 -07006946 if (!dev_data->dispatch_table.GetDeviceProcAddr) return nullptr;
6947 return dev_data->dispatch_table.GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006948}
6949
Chia-I Wu01ca2372016-05-13 14:37:49 +08006950VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06006951
Mark Young4e423c02017-03-07 13:09:00 -07006952 PFN_vkVoidFunction addr = layer_intercept_proc(funcName);
6953 if (addr) return addr;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06006954
Chia-I Wu617f2a42016-05-16 07:41:17 +08006955 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006956
Mark Young4e423c02017-03-07 13:09:00 -07006957 auto instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07006958
Mark Young4e423c02017-03-07 13:09:00 -07006959 if (!instance_data->dispatch_table.GetInstanceProcAddr) return nullptr;
6960 return instance_data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06006961}
Chia-I Wu99f701c2016-05-13 14:06:08 +08006962
Mark Young39389872017-01-19 21:10:49 -07006963VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName) {
6964 assert(instance);
Mark Young4e423c02017-03-07 13:09:00 -07006965 auto pdev_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006966
Mark Young4e423c02017-03-07 13:09:00 -07006967 if (!pdev_data->dispatch_table.GetPhysicalDeviceProcAddr) return nullptr;
6968 return pdev_data->dispatch_table.GetPhysicalDeviceProcAddr(instance, funcName);
Mark Young39389872017-01-19 21:10:49 -07006969}
6970
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006971} // namespace parameter_validation
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006972
6973// vk_layer_logging.h expects these to be defined
6974
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006975VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
6976 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
6977 const VkAllocationCallbacks *pAllocator,
6978 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006979 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006980}
6981
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006982VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
6983 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006984 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006985}
6986
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006987VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
6988 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
6989 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006990 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006991}
6992
6993// loader-layer interface v0
6994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006995VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
6996 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006997 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08006998}
6999
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007000VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
7001 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08007002 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08007003}
7004
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007005VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
7006 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08007007 // the layer command handles VK_NULL_HANDLE just fine internally
7008 assert(physicalDevice == VK_NULL_HANDLE);
7009 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007010}
7011
7012VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
7013 const char *pLayerName, uint32_t *pCount,
7014 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08007015 // the layer command handles VK_NULL_HANDLE just fine internally
7016 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08007017 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007018}
7019
7020VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08007021 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007022}
7023
7024VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08007025 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08007026}
Mark Young39389872017-01-19 21:10:49 -07007027
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007028VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_layerGetPhysicalDeviceProcAddr(VkInstance instance,
7029 const char *funcName) {
Mark Young39389872017-01-19 21:10:49 -07007030 return parameter_validation::GetPhysicalDeviceProcAddr(instance, funcName);
7031}
7032
7033VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct) {
7034 assert(pVersionStruct != NULL);
7035 assert(pVersionStruct->sType == LAYER_NEGOTIATE_INTERFACE_STRUCT);
7036
7037 // Fill in the function pointers if our version is at least capable of having the structure contain them.
7038 if (pVersionStruct->loaderLayerInterfaceVersion >= 2) {
7039 pVersionStruct->pfnGetInstanceProcAddr = vkGetInstanceProcAddr;
7040 pVersionStruct->pfnGetDeviceProcAddr = vkGetDeviceProcAddr;
7041 pVersionStruct->pfnGetPhysicalDeviceProcAddr = vk_layerGetPhysicalDeviceProcAddr;
7042 }
7043
7044 if (pVersionStruct->loaderLayerInterfaceVersion < CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
7045 parameter_validation::loader_layer_if_version = pVersionStruct->loaderLayerInterfaceVersion;
7046 } else if (pVersionStruct->loaderLayerInterfaceVersion > CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
7047 pVersionStruct->loaderLayerInterfaceVersion = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
7048 }
7049
7050 return VK_SUCCESS;
7051}