blob: 20884a16856be9d88addd7e50c1806ab5a7711cb [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
Mike Weiblena4742dc2016-10-31 11:05:56 -060026#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060027#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060028#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32#include <iostream>
33#include <string>
34#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050035#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060036#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060037#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060038
Chris Forbes6444bba2016-11-24 14:15:23 +130039#include "vk_dispatch_table_helper.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060040#include "vk_enum_validate_helper.h"
Chris Forbes6444bba2016-11-24 14:15:23 +130041#include "vk_layer_config.h"
42#include "vk_loader_platform.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060043#include "vk_struct_validate_helper.h"
Chris Forbes6444bba2016-11-24 14:15:23 +130044#include "vulkan/vk_layer.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060045
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060046#include "vk_layer_table.h"
47#include "vk_layer_data.h"
48#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060049#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070050#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060051
Dustin Graves8ffbbf62016-07-22 13:19:46 -060052#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060053#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070054
Chia-I Wu1a6b1932016-05-13 14:07:36 +080055namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060056
Chris Forbes7b58a712016-11-24 11:35:31 +130057struct instance_layer_data {
Chris Forbes7b57a392016-11-02 17:56:50 +130058 VkInstance instance = VK_NULL_HANDLE;
Chia-I Wua570b7c2016-05-16 07:48:14 +080059
Chris Forbes7b57a392016-11-02 17:56:50 +130060 debug_report_data *report_data = nullptr;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070061 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060062
Ian Elliotted6b5ac2016-04-28 09:08:13 -060063 // The following are for keeping track of the temporary callbacks that can
64 // be used in vkCreateInstance and vkDestroyInstance:
Chris Forbes7b57a392016-11-02 17:56:50 +130065 uint32_t num_tmp_callbacks = 0;
66 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos = nullptr;
67 VkDebugReportCallbackEXT *tmp_callbacks = nullptr;
Chris Forbes6be763e2016-11-24 12:42:33 +130068 instance_extension_enables extensions = {};
Chris Forbes6444bba2016-11-24 14:15:23 +130069
70 VkLayerInstanceDispatchTable dispatch_table = {};
Chris Forbes7b58a712016-11-24 11:35:31 +130071};
Ian Elliotted6b5ac2016-04-28 09:08:13 -060072
Chris Forbes7b58a712016-11-24 11:35:31 +130073struct layer_data {
74 instance_layer_data *instance_data = nullptr;
75
Jon Ashburn5484e0c2016-03-08 17:48:44 -070076 // Device Data
Chris Forbes7b58a712016-11-24 11:35:31 +130077 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070078 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060079 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130080 VkPhysicalDeviceLimits device_limits = {};
81 VkPhysicalDeviceFeatures physical_device_features = {};
82 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Michael Lentinebdf744f2016-01-27 15:43:43 -060083
Chris Forbes7b57a392016-11-02 17:56:50 +130084 bool swapchain_enabled = false;
85 bool display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -060086 bool amd_negative_viewport_height_enabled = false;
Chris Forbese58c9fe2016-11-24 14:44:17 +130087
88 VkLayerDispatchTable dispatch_table = {};
Cody Northrop55443ef2015-09-28 15:09:32 -060089};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050090
Jon Ashburn5484e0c2016-03-08 17:48:44 -070091static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +130092static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060093
Chris Forbes7b58a712016-11-24 11:35:31 +130094static void init_parameter_validation(instance_layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060095
Mark Lobodzinski739391a2016-03-17 15:08:18 -060096 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060097}
98
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060099VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
100 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
101 const VkAllocationCallbacks *pAllocator,
102 VkDebugReportCallbackEXT *pMsgCallback) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300103 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
104 VkResult result = data->dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600105
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700106 if (result == VK_SUCCESS) {
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600107 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600108 }
109
110 return result;
111}
112
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600113VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800114 const VkAllocationCallbacks *pAllocator) {
Chris Forbes7b58a712016-11-24 11:35:31 +1300115 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300116 data->dispatch_table.DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
117
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700118 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600119}
120
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600121VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
122 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
123 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300124 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
125 data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700126}
127
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700128static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600129
Chia-I Wu3384db82016-05-16 07:30:58 +0800130static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600131 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800132};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700133
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700134static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600135 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700136 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
137 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
138 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
139 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
140 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 -0700141 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700142 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600143 return false;
144 }
145
146 return true;
147}
148
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700149static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
150 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600151 return "unrecognized enumerator";
152 }
153
154 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600156 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700158 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600159 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
160 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
163 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600165 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
166 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
169 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700170 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600171 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600180 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600183 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800186 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600187 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800189 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600190 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700191 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700192 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
193 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194
195 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600197 enumeratorString += string;
198
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600200 enumeratorString += '|';
201 }
202 }
203
204 return enumeratorString;
205}
206
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700207static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
208 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
209 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
210 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
211 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
212 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600213 return false;
214 }
215
216 return true;
217}
218
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700219static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
220 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600221 return "unrecognized enumerator";
222 }
223
224 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700225 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600226 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
227 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700228 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600229 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600230 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700231 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
233 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700234 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600235 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
236 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600238 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
239 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600242 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600244 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
245 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700246 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800247 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600248 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249
250 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 enumeratorString += string;
253
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600255 enumeratorString += '|';
256 }
257 }
258
259 return enumeratorString;
260}
261
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
263 VkQueueFlagBits allFlags =
264 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
265 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600266 return false;
267 }
268
269 return true;
270}
271
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700272static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
273 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600274 return "unrecognized enumerator";
275 }
276
277 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700278 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800279 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600280 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600282 strings.push_back("VK_QUEUE_COMPUTE_BIT");
283 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700284 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800285 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600286 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700287 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600288 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
289 }
290
291 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600293 enumeratorString += string;
294
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600296 enumeratorString += '|';
297 }
298 }
299
300 return enumeratorString;
301}
302
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700303static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
304 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
305 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
306 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
307 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600308 return false;
309 }
310
311 return true;
312}
313
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
315 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600316 return "unrecognized enumerator";
317 }
318
319 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600321 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
322 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800324 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600325 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600327 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
328 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700329 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800330 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600331 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800333 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600334 }
335
336 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600338 enumeratorString += string;
339
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600341 enumeratorString += '|';
342 }
343 }
344
345 return enumeratorString;
346}
347
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700348static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700349 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700350 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600351 return false;
352 }
353
354 return true;
355}
356
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
358 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600359 return "unrecognized enumerator";
360 }
361
362 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700363 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800364 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600365 }
366
367 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600369 enumeratorString += string;
370
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700371 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600372 enumeratorString += '|';
373 }
374 }
375
376 return enumeratorString;
377}
378
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700379static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
380 VkSparseImageFormatFlagBits allFlags =
381 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
382 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
383 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600384 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600385 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600386
387 return true;
388}
389
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700390static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
391 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600392 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600393 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600394
395 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800397 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600398 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700399 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800400 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600401 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700402 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800403 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600404 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405
406 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600408 enumeratorString += string;
409
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700410 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411 enumeratorString += '|';
412 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600413 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600414
415 return enumeratorString;
416}
417
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700418static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700419 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700420 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600421 return false;
422 }
423
424 return true;
425}
426
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
428 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600429 return "unrecognized enumerator";
430 }
431
432 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700433 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600434 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
435 }
436
437 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600439 enumeratorString += string;
440
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700441 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600442 enumeratorString += '|';
443 }
444 }
445
446 return enumeratorString;
447}
448
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700449static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
450 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
451 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
452 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
453 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
454 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600455 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
456 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
457 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600459 return false;
460 }
461
462 return true;
463}
464
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700465static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
466 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600467 return "unrecognized enumerator";
468 }
469
470 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700471 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700472 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700475 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700478 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600479 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700481 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600482 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700484 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_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_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700487 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600488 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700499 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700501 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700502 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600503 }
504
505 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600507 enumeratorString += string;
508
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600510 enumeratorString += '|';
511 }
512 }
513
514 return enumeratorString;
515}
516
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700517static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
518 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
519 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
520 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600521 return false;
522 }
523
524 return true;
525}
526
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700527static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
528 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600529 return "unrecognized enumerator";
530 }
531
532 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700533 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600534 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
535 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600537 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
538 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700539 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
541 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700542 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600543 strings.push_back("VK_QUERY_RESULT_64_BIT");
544 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600545
546 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700547 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600548 enumeratorString += string;
549
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600551 enumeratorString += '|';
552 }
553 }
554
555 return enumeratorString;
556}
557
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700558static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
559 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
560 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
561 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
562 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
563 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600564 return false;
565 }
566
567 return true;
568}
569
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700570static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
571 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600572 return "unrecognized enumerator";
573 }
574
575 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700576 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600577 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
578 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700579 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600580 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
581 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700582 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
584 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700585 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600586 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
587 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600589 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
590 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700591 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800592 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600593 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600595 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
596 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700597 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800598 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600599 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700600 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600601 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
602 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603
604 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 enumeratorString += string;
607
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700608 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600609 enumeratorString += '|';
610 }
611 }
612
613 return enumeratorString;
614}
615
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700616static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
617 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
618 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
619 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620 return false;
621 }
622
623 return true;
624}
625
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700626static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
627 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600628 return "unrecognized enumerator";
629 }
630
631 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700632 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600633 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
634 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700635 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600636 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
637 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700638 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600639 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600640 }
641
642 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600644 enumeratorString += string;
645
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700646 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600647 enumeratorString += '|';
648 }
649 }
650
651 return enumeratorString;
652}
653
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700654static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
655 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
656 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
657 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
658 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600659 return false;
660 }
661
662 return true;
663}
664
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700665static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
666 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600667 return "unrecognized enumerator";
668 }
669
670 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600672 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
673 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600675 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
676 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600678 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
679 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700680 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600681 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
682 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700683 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600684 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600685 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686
687 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600689 enumeratorString += string;
690
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700691 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600692 enumeratorString += '|';
693 }
694 }
695
696 return enumeratorString;
697}
698
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700699static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
700 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
701 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
702 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 return false;
704 }
705
706 return true;
707}
708
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700709static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
710 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600711 return "unrecognized enumerator";
712 }
713
714 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700715 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800716 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800719 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700721 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800722 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600723 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700724 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800725 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600726 }
727
728 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700729 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600730 enumeratorString += string;
731
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700732 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600733 enumeratorString += '|';
734 }
735 }
736
737 return enumeratorString;
738}
739
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700740static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
741 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
742 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
743 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600744 return false;
745 }
746
747 return true;
748}
749
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700750static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
751 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600752 return "unrecognized enumerator";
753 }
754
755 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700756 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600757 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
758 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700759 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600760 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
761 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700762 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600763 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600764 }
765
766 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700767 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600768 enumeratorString += string;
769
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700770 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600771 enumeratorString += '|';
772 }
773 }
774
775 return enumeratorString;
776}
777
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700778static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
779 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
780 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
781 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
782 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600783 return false;
784 }
785
786 return true;
787}
788
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
790 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600791 return "unrecognized enumerator";
792 }
793
794 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600796 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600797 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600799 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600800 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700801 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600802 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
803 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700804 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600805 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600808 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600809 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700810 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600811 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600812 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700813 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600814 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600815 }
816
817 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600819 enumeratorString += string;
820
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600822 enumeratorString += '|';
823 }
824 }
825
826 return enumeratorString;
827}
828
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800830 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700831 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
832 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
833 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
834 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
835 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
836 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 -0700837 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600839 return false;
840 }
841
842 return true;
843}
844
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700845static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
846 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600847 return "unrecognized enumerator";
848 }
849
850 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800852 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
853 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800855 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600858 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600859 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600861 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600862 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600864 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700866 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700867 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600868 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600870 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600873 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600876 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600882 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600885 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700888 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
898 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700899 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600900 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600901 }
902
903 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600905 enumeratorString += string;
906
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700907 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600908 enumeratorString += '|';
909 }
910 }
911
912 return enumeratorString;
913}
914
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700915static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800916 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700917 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
918 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
919 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
920 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
921 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 +0800922
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700923 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600924 return false;
925 }
926
927 return true;
928}
929
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700930static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
931 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600932 return "unrecognized enumerator";
933 }
934
935 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700936 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800937 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600938 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700939 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800940 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600941 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700942 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800943 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600944 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700945 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800946 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600947 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800949 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600950 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800952 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600953 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600983 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700984 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800985 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600986 }
987
988 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600990 enumeratorString += string;
991
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700992 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600993 enumeratorString += '|';
994 }
995 }
996
997 return enumeratorString;
998}
999
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001000static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1001 VkCommandPoolCreateFlagBits allFlags =
1002 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1003 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001004 return false;
1005 }
1006
1007 return true;
1008}
1009
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001010static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1011 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001012 return "unrecognized enumerator";
1013 }
1014
1015 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001016 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001017 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001018 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001019 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001020 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001021 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001022
1023 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001024 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001025 enumeratorString += string;
1026
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001027 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001028 enumeratorString += '|';
1029 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001030 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001031
1032 return enumeratorString;
1033}
1034
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001035static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001036 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001037 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001038 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001039 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001040
1041 return true;
1042}
1043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1045 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001046 return "unrecognized enumerator";
1047 }
1048
1049 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001050 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001051 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001052 }
1053
1054 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001056 enumeratorString += string;
1057
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001058 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001059 enumeratorString += '|';
1060 }
1061 }
1062
1063 return enumeratorString;
1064}
1065
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001066static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1067 VkCommandBufferUsageFlags allFlags =
1068 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1069 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1070 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001071 return false;
1072 }
1073
1074 return true;
1075}
1076
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001077static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1078 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001079 return "unrecognized enumerator";
1080 }
1081
1082 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001085 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001086 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001087 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001089 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001090 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001091 }
1092
1093 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001095 enumeratorString += string;
1096
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001097 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001098 enumeratorString += '|';
1099 }
1100 }
1101
1102 return enumeratorString;
1103}
1104
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001105static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001106 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001107 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001108 return false;
1109 }
1110
1111 return true;
1112}
1113
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1115 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001116 return "unrecognized enumerator";
1117 }
1118
1119 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001120 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001121 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001122 }
1123
1124 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001126 enumeratorString += string;
1127
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001128 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001129 enumeratorString += '|';
1130 }
1131 }
1132
1133 return enumeratorString;
1134}
1135
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001136static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1137 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1138 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1139 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001140 return false;
1141 }
1142
1143 return true;
1144}
1145
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001146static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1147 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001148 return "unrecognized enumerator";
1149 }
1150
1151 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001152 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001153 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001156 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001158 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001159 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1160 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001161 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001162 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1163 }
1164
1165 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001166 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 enumeratorString += string;
1168
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001169 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170 enumeratorString += '|';
1171 }
1172 }
1173
1174 return enumeratorString;
1175}
1176
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001177static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001178 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001179 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001180 return false;
1181 }
1182
1183 return true;
1184}
1185
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1187 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001188 return "unrecognized enumerator";
1189 }
1190
1191 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001192 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001193 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001194 }
1195
1196 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001198 enumeratorString += string;
1199
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001200 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001201 enumeratorString += '|';
1202 }
1203 }
1204
1205 return enumeratorString;
1206}
1207
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001208static const int MaxParamCheckerStringLength = 256;
1209
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001210static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001211 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001212 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001213 assert(validateString != nullptr);
1214
Chris Forbes04b61da2016-11-03 09:53:59 +13001215 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001216
1217 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1218
1219 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001220 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001221 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001222
Chris Forbes04b61da2016-11-03 09:53:59 +13001223 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001224 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1225 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001226 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001227 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001228 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1229 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001230 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001231 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001232}
1233
Dustin Gravesde628532016-04-21 16:30:17 -06001234static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1235 uint32_t index) {
1236 assert(device_data != nullptr);
1237 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001238 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001239
1240 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001241 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001242 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001243 } else {
1244 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1245 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001246 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001247 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1248 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001249 function_name, parameter_name, index);
1250 return false;
1251 }
1252 }
1253
Chris Forbes04b61da2016-11-03 09:53:59 +13001254 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001255}
1256
1257static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1258 const uint32_t count, const uint32_t *indices) {
1259 assert(device_data != nullptr);
1260 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001261 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001262
1263 if (indices != nullptr) {
1264 for (uint32_t i = 0; i < count; i++) {
1265 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001266 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001267 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001268 } else {
1269 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1270 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001271 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001272 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1273 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001274 function_name, parameter_name, i, indices[i]);
1275 return false;
1276 }
1277 }
1278 }
1279 }
1280
Chris Forbes04b61da2016-11-03 09:53:59 +13001281 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001282}
1283
Chris Forbes6be763e2016-11-24 12:42:33 +13001284static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001285
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001286VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1287 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001288 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001289
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001290 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001291 assert(chain_info != nullptr);
1292 assert(chain_info->u.pLayerInfo != nullptr);
1293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001294 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1295 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001296 if (fpCreateInstance == NULL) {
1297 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001298 }
1299
Dustin Graves842621d2016-03-03 14:17:08 -07001300 // Advance the link info for the next element on the chain
1301 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1302
1303 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001304
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001305 if (result == VK_SUCCESS) {
Chris Forbes7b58a712016-11-24 11:35:31 +13001306 auto my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), instance_layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001307 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001308
Chris Forbes6444bba2016-11-24 14:15:23 +13001309 layer_init_instance_dispatch_table(*pInstance, &my_instance_data->dispatch_table, fpGetInstanceProcAddr);
Chia-I Wua570b7c2016-05-16 07:48:14 +08001310 my_instance_data->instance = *pInstance;
Chris Forbes6444bba2016-11-24 14:15:23 +13001311 my_instance_data->report_data =
1312 debug_report_create_instance(&my_instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount,
1313 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001314
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001315 // Look for one or more debug report create info structures
1316 // and setup a callback(s) for each one found.
1317 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1318 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1319 if (my_instance_data->num_tmp_callbacks > 0) {
1320 // Setup the temporary callback(s) here to catch early issues:
1321 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1322 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1323 // Failure of setting up one or more of the callback.
1324 // Therefore, clean up and don't use those callbacks:
1325 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1326 my_instance_data->num_tmp_callbacks = 0;
1327 }
1328 }
1329 }
1330
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001331 init_parameter_validation(my_instance_data, pAllocator);
Chris Forbes6be763e2016-11-24 12:42:33 +13001332 CheckInstanceRegisterExtensions(pCreateInfo, my_instance_data);
Dustin Graves842621d2016-03-03 14:17:08 -07001333
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001334 // Ordinarily we'd check these before calling down the chain, but none of the layer
1335 // support is in place until now, if we survive we can report the issue now.
1336 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001337
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001338 if (pCreateInfo->pApplicationInfo) {
1339 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1340 validate_string(my_instance_data->report_data, "vkCreateInstance",
1341 "pCreateInfo->VkApplicationInfo->pApplicationName",
1342 pCreateInfo->pApplicationInfo->pApplicationName);
1343 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001344
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001345 if (pCreateInfo->pApplicationInfo->pEngineName) {
1346 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1347 pCreateInfo->pApplicationInfo->pEngineName);
1348 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001349 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001350
1351 // Disable the tmp callbacks:
1352 if (my_instance_data->num_tmp_callbacks > 0) {
1353 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1354 my_instance_data->tmp_callbacks);
1355 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001356 }
1357
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001358 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001359}
1360
Chia-I Wu01ca2372016-05-13 14:37:49 +08001361VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001362 // Grab the key before the instance is destroyed.
1363 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001364 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001365 auto my_data = get_my_data_ptr(key, instance_layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001366 assert(my_data != NULL);
1367
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001368 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1369 bool callback_setup = false;
1370 if (my_data->num_tmp_callbacks > 0) {
1371 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1372 my_data->tmp_callbacks)) {
1373 callback_setup = true;
1374 }
1375 }
1376
Chris Forbes04b61da2016-11-03 09:53:59 +13001377 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001378
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001379 // Disable and cleanup the temporary callback(s):
1380 if (callback_setup) {
1381 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1382 }
1383 if (my_data->num_tmp_callbacks > 0) {
1384 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1385 my_data->num_tmp_callbacks = 0;
1386 }
1387
Chris Forbes04b61da2016-11-03 09:53:59 +13001388 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001389 my_data->dispatch_table.DestroyInstance(instance, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001390
1391 // Clean up logging callback, if any
1392 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001393 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1394 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001395 my_data->logging_callback.pop_back();
1396 }
1397
Chris Forbes78a56b02016-11-02 16:13:01 +13001398 layer_debug_report_destroy_instance(my_data->report_data);
Chris Forbes6444bba2016-11-24 14:15:23 +13001399 instance_layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001400 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001401}
1402
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001403VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1404 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001405 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001406 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001407 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001408 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001409
Chris Forbes04b61da2016-11-03 09:53:59 +13001410 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001411
Chris Forbes04b61da2016-11-03 09:53:59 +13001412 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001413 result = my_data->dispatch_table.EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001414 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001415 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001416 return result;
1417}
1418
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001419VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001420 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001421 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001422 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001423
Chris Forbes04b61da2016-11-03 09:53:59 +13001424 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001425
Chris Forbes04b61da2016-11-03 09:53:59 +13001426 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001427 my_data->dispatch_table.GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001428 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001429}
1430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001431VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1432 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001433 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001434 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001435 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001436
Chris Forbes04b61da2016-11-03 09:53:59 +13001437 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001438
Chris Forbes04b61da2016-11-03 09:53:59 +13001439 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001440 my_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001441 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001442}
1443
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001444VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1445 VkImageType type, VkImageTiling tiling,
1446 VkImageUsageFlags usage, VkImageCreateFlags flags,
1447 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001448 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001449 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001450 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001451 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001452
Chris Forbes04b61da2016-11-03 09:53:59 +13001453 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001454 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001455
Chris Forbes04b61da2016-11-03 09:53:59 +13001456 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001457 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1458 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001460 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001461 }
Chia-I Wu17241042015-10-31 00:31:16 +08001462
1463 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001464}
1465
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001466VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001467 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001468 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001470
Chris Forbes04b61da2016-11-03 09:53:59 +13001471 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001472
Chris Forbes04b61da2016-11-03 09:53:59 +13001473 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001474 my_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001475 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001476}
1477
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001478VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1479 uint32_t *pQueueFamilyPropertyCount,
1480 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001481 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001482 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001483 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001484
Chris Forbes04b61da2016-11-03 09:53:59 +13001485 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001486 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487
Chris Forbes04b61da2016-11-03 09:53:59 +13001488 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001489 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount,
1490 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001491 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001492}
1493
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001494VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1495 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001496 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001497 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001498 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001499
Chris Forbes04b61da2016-11-03 09:53:59 +13001500 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501
Chris Forbes04b61da2016-11-03 09:53:59 +13001502 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001503 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001505}
1506
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001507void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1508 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001509 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001510
Chris Forbes7b58a712016-11-24 11:35:31 +13001511 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes0e0161a2016-11-02 16:21:28 +13001512
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001513 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1514 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1515 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001516 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 -06001517 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001518 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1519 "structure.",
1520 i);
1521 } else {
1522 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001523 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001524
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001525 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1526 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1527 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1528 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001529 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 -06001530 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001531 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1532 "between 0 and 1. Actual value is %f",
1533 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1534 }
1535 }
1536 }
1537
1538 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1539 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001540 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 -06001541 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001542 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1543 "of queue families.",
1544 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001545 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1546 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1547 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001548 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 -06001549 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001550 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1551 "queues for the given family index.",
1552 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001553 }
Michael Lentine774704f2016-01-27 13:36:46 -06001554 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001555 }
1556}
1557
Chris Forbes6be763e2016-11-24 12:42:33 +13001558static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001559
1560 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001561 auto name = pCreateInfo->ppEnabledExtensionNames[i];
1562
1563 if (strcmp(name, VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1564 instance_data->extensions.surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001565 }
1566#ifdef VK_USE_PLATFORM_XLIB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001567 if (strcmp(name, VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
1568 instance_data->extensions.xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001569 }
1570#endif
1571#ifdef VK_USE_PLATFORM_XCB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001572 if (strcmp(name, VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
1573 instance_data->extensions.xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001574 }
1575#endif
1576#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001577 if (strcmp(name, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
1578 instance_data->extensions.wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001579 }
1580#endif
1581#ifdef VK_USE_PLATFORM_MIR_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001582 if (strcmp(name, VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
1583 instance_data->extensions.mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001584 }
1585#endif
1586#ifdef VK_USE_PLATFORM_ANDROID_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001587 if (strcmp(name, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
1588 instance_data->extensions.android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001589 }
1590#endif
1591#ifdef VK_USE_PLATFORM_WIN32_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001592 if (strcmp(name, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
1593 instance_data->extensions.win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001594 }
1595#endif
Chris Forbes6be763e2016-11-24 12:42:33 +13001596 if (strcmp(name, VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
1597 instance_data->extensions.display_enabled = true;
Chris Forbes2e47f432016-11-03 10:18:18 +13001598 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001599 }
1600}
1601
1602static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1603 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001604 device_data->swapchain_enabled = false;
1605 device_data->display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001606 device_data->amd_negative_viewport_height_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001607
1608 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1609 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001610 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001611 }
Mark Youngead9b932016-09-08 12:28:38 -06001612 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001613 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001614 }
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001615 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME) == 0) {
1616 device_data->amd_negative_viewport_height_enabled = true;
1617 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001618 }
1619}
1620
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001621void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001622 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001623
1624 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1625 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1626 my_device_data->queueFamilyIndexMap.insert(
1627 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1628 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001629 }
1630}
1631
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001632VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001633 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001634 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001635 * NOTE: We do not validate physicalDevice or any dispatchable
1636 * object as the first parameter. We couldn't get here if it was wrong!
1637 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001638
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001639 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001640 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001641 auto my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001642 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001643
Chris Forbes04b61da2016-11-03 09:53:59 +13001644 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001645
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001646 if (pCreateInfo != NULL) {
1647 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001648 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001649 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001650 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001651 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001652 }
Michael Lentine774704f2016-01-27 13:36:46 -06001653
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001654 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001655 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001656 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001657 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001658 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001659 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001660 }
1661
Chris Forbes04b61da2016-11-03 09:53:59 +13001662 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001663 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001664 assert(chain_info != nullptr);
1665 assert(chain_info->u.pLayerInfo != nullptr);
1666
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001667 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1668 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001669 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001670 if (fpCreateDevice == NULL) {
1671 return VK_ERROR_INITIALIZATION_FAILED;
1672 }
1673
1674 // Advance the link info for the next element on the chain
1675 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1676
1677 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001678
1679 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1680
1681 if (result == VK_SUCCESS) {
1682 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1683 assert(my_device_data != nullptr);
1684
1685 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Chris Forbese58c9fe2016-11-24 14:44:17 +13001686 layer_init_device_dispatch_table(*pDevice, &my_device_data->dispatch_table, fpGetDeviceProcAddr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001687
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001688 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1689
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001690 uint32_t count;
Chris Forbes6444bba2016-11-24 14:15:23 +13001691 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001692 std::vector<VkQueueFamilyProperties> properties(count);
Chris Forbes6444bba2016-11-24 14:15:23 +13001693 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001694
1695 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1696 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001697
1698 // Query and save physical device limits for this device
1699 VkPhysicalDeviceProperties device_properties = {};
Chris Forbes6444bba2016-11-24 14:15:23 +13001700 my_instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &device_properties);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001701 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001702 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001703
1704 // Save app-enabled features in this device's layer_data structure
1705 if (pCreateInfo->pEnabledFeatures) {
1706 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1707 } else {
1708 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1709 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001710 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001711 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001712
Jeremy Hayes99a96322015-06-26 12:48:09 -06001713 return result;
1714}
1715
Chia-I Wu01ca2372016-05-13 14:37:49 +08001716VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001717 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001718 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001719 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1720 assert(my_data != NULL);
1721
Chris Forbes04b61da2016-11-03 09:53:59 +13001722 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001723
Chris Forbes04b61da2016-11-03 09:53:59 +13001724 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001725 layer_debug_report_destroy_device(device);
1726
Jeremy Hayes99a96322015-06-26 12:48:09 -06001727#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001728 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001729#endif
1730
Chris Forbese58c9fe2016-11-24 14:44:17 +13001731 my_data->dispatch_table.DestroyDevice(device, pAllocator);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001732 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001733 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001734}
1735
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001736bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001737 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001738 assert(my_device_data != nullptr);
1739
Dustin Gravesde628532016-04-21 16:30:17 -06001740 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001741
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001742 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001743 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001744 log_msg(my_device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001745 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001746 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1747 "was created.",
1748 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001749 return false;
1750 }
1751 return true;
1752}
1753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001754VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001755 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001756 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001757 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001758
Chris Forbes04b61da2016-11-03 09:53:59 +13001759 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001760
Chris Forbes04b61da2016-11-03 09:53:59 +13001761 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001762 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1763
Chris Forbese58c9fe2016-11-24 14:44:17 +13001764 my_data->dispatch_table.GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001765 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001766}
1767
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001768VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001770 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001772 assert(my_data != NULL);
1773
Chris Forbes04b61da2016-11-03 09:53:59 +13001774 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001775
Chris Forbes04b61da2016-11-03 09:53:59 +13001776 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001777 result = my_data->dispatch_table.QueueSubmit(queue, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001778
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001779 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001780 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001781
Jeremy Hayes99a96322015-06-26 12:48:09 -06001782 return result;
1783}
1784
Chia-I Wu01ca2372016-05-13 14:37:49 +08001785VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1787 assert(my_data != NULL);
1788
Chris Forbese58c9fe2016-11-24 14:44:17 +13001789 VkResult result = my_data->dispatch_table.QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001791 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001792
1793 return result;
1794}
1795
Chia-I Wu01ca2372016-05-13 14:37:49 +08001796VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1798 assert(my_data != NULL);
1799
Chris Forbese58c9fe2016-11-24 14:44:17 +13001800 VkResult result = my_data->dispatch_table.DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001801
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001802 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001803
1804 return result;
1805}
1806
Chia-I Wu01ca2372016-05-13 14:37:49 +08001807VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001808 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001809 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001810 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001812 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001813
Chris Forbes04b61da2016-11-03 09:53:59 +13001814 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001815
Chris Forbes04b61da2016-11-03 09:53:59 +13001816 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001817 result = my_data->dispatch_table.AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001818
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001819 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001820 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
1822 return result;
1823}
1824
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001825VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001826 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001828 assert(my_data != NULL);
1829
Chris Forbes04b61da2016-11-03 09:53:59 +13001830 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001831
Chris Forbes04b61da2016-11-03 09:53:59 +13001832 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001833 my_data->dispatch_table.FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001834 }
1835}
1836
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001837VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1838 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001840 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001843
Chris Forbes04b61da2016-11-03 09:53:59 +13001844 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001845
Chris Forbes04b61da2016-11-03 09:53:59 +13001846 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001847 result = my_data->dispatch_table.MapMemory(device, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001848
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001849 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001851
1852 return result;
1853}
1854
Chia-I Wu01ca2372016-05-13 14:37:49 +08001855VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001856 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001857 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1858 assert(my_data != NULL);
1859
Chris Forbes04b61da2016-11-03 09:53:59 +13001860 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001861
Chris Forbes04b61da2016-11-03 09:53:59 +13001862 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001863 my_data->dispatch_table.UnmapMemory(device, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001864 }
1865}
1866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001867VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1868 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001870 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001873
Chris Forbes04b61da2016-11-03 09:53:59 +13001874 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001875
Chris Forbes04b61da2016-11-03 09:53:59 +13001876 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001877 result = my_data->dispatch_table.FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001879 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001881
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001882 return result;
1883}
1884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001885VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1886 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001887 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001888 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001890 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001891
Chris Forbes04b61da2016-11-03 09:53:59 +13001892 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001893
Chris Forbes04b61da2016-11-03 09:53:59 +13001894 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001895 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13001896 my_data->dispatch_table.InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001897
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001898 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001900
Tony Barbourb1250542015-04-16 19:23:13 -06001901 return result;
1902}
1903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001904VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1905 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001906 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001908 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001909
Chris Forbes04b61da2016-11-03 09:53:59 +13001910 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911
Chris Forbes04b61da2016-11-03 09:53:59 +13001912 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001913 my_data->dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001915}
1916
Chia-I Wu01ca2372016-05-13 14:37:49 +08001917VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1918 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001919 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001920 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1922 assert(my_data != NULL);
1923
Chris Forbes04b61da2016-11-03 09:53:59 +13001924 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001925
Chris Forbes04b61da2016-11-03 09:53:59 +13001926 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001927 result = my_data->dispatch_table.BindBufferMemory(device, buffer, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001928
1929 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1930 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001931
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001932 return result;
1933}
1934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001935VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001936 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001937 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001938 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1939 assert(my_data != NULL);
1940
Chris Forbes04b61da2016-11-03 09:53:59 +13001941 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001942
Chris Forbes04b61da2016-11-03 09:53:59 +13001943 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001944 result = my_data->dispatch_table.BindImageMemory(device, image, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001945
1946 validate_result(my_data->report_data, "vkBindImageMemory", result);
1947 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001948
1949 return result;
1950}
1951
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001952VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1953 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001954 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001956 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001957
Chris Forbes04b61da2016-11-03 09:53:59 +13001958 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001959
Chris Forbes04b61da2016-11-03 09:53:59 +13001960 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001961 my_data->dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001962 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001963}
1964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001965VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001966 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001967 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001968 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001969
Chris Forbes04b61da2016-11-03 09:53:59 +13001970 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001971
Chris Forbes04b61da2016-11-03 09:53:59 +13001972 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001973 my_data->dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001974 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001975}
1976
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1978 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001981 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001982 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1983 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001984 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001985 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1987 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001988 return false;
1989 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001990 }
1991
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001992 return true;
1993}
1994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001995VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1996 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001997 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002000
Chris Forbes04b61da2016-11-03 09:53:59 +13002001 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002002 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002003
Chris Forbes04b61da2016-11-03 09:53:59 +13002004 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002005 my_data->dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002006
2007 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2008 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002009}
2010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002011bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2012 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2013 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes7b58a712016-11-24 11:35:31 +13002014 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002015 if (pProperties != nullptr) {
2016 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2017 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002018 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 -06002019 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002020 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2021 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002022 return false;
2023 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002024 }
2025
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002026 return true;
2027}
2028
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002029VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2030 VkImageType type, VkSampleCountFlagBits samples,
2031 VkImageUsageFlags usage, VkImageTiling tiling,
2032 uint32_t *pPropertyCount,
2033 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002034 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13002035 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002036 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002037
Chris Forbes04b61da2016-11-03 09:53:59 +13002038 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002039 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002040
Chris Forbes04b61da2016-11-03 09:53:59 +13002041 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13002042 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling,
2043 pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002044
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002045 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2046 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002047 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002048}
2049
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002050VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2051 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002052 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002053 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002054 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002055 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002056
Chris Forbes04b61da2016-11-03 09:53:59 +13002057 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002058
Chris Forbes04b61da2016-11-03 09:53:59 +13002059 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002060 result = my_data->dispatch_table.QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002061
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002062 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002064
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002065 return result;
2066}
2067
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002068VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2069 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002071 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002073 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002074
Chris Forbes04b61da2016-11-03 09:53:59 +13002075 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002076
Chris Forbes04b61da2016-11-03 09:53:59 +13002077 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002078 result = my_data->dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002080 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002081 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002082
2083 return result;
2084}
2085
Chia-I Wu01ca2372016-05-13 14:37:49 +08002086VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002087 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002088 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002089 assert(my_data != NULL);
2090
Chris Forbes04b61da2016-11-03 09:53:59 +13002091 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002092
Chris Forbes04b61da2016-11-03 09:53:59 +13002093 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002094 my_data->dispatch_table.DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002095 }
2096}
2097
Chia-I Wu01ca2372016-05-13 14:37:49 +08002098VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002099 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002100 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002102 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002103
Chris Forbes04b61da2016-11-03 09:53:59 +13002104 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002105
Chris Forbes04b61da2016-11-03 09:53:59 +13002106 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002107 result = my_data->dispatch_table.ResetFences(device, fenceCount, pFences);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002109 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002110 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002111
2112 return result;
2113}
2114
Chia-I Wu01ca2372016-05-13 14:37:49 +08002115VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002116 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002117 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002118 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2119 assert(my_data != NULL);
2120
Chris Forbes04b61da2016-11-03 09:53:59 +13002121 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002122
Chris Forbes04b61da2016-11-03 09:53:59 +13002123 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002124 result = my_data->dispatch_table.GetFenceStatus(device, fence);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002125
2126 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2127 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002128
2129 return result;
2130}
2131
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002132VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2133 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002134 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002135 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002136 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002137 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002138
Chris Forbes04b61da2016-11-03 09:53:59 +13002139 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002140
Chris Forbes04b61da2016-11-03 09:53:59 +13002141 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002142 result = my_data->dispatch_table.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002143
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002144 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002145 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002146
2147 return result;
2148}
2149
Chia-I Wu01ca2372016-05-13 14:37:49 +08002150VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002151 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002152 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002153 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002154 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002155 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002156
Chris Forbes04b61da2016-11-03 09:53:59 +13002157 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002158
Chris Forbes04b61da2016-11-03 09:53:59 +13002159 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002160 result = my_data->dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002162 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002163 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002164
2165 return result;
2166}
2167
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002168VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002169 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002170 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002171 assert(my_data != NULL);
2172
Chris Forbes04b61da2016-11-03 09:53:59 +13002173 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002174
Chris Forbes04b61da2016-11-03 09:53:59 +13002175 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002176 my_data->dispatch_table.DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002177 }
2178}
2179
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002180VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2181 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002183 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002185 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002186
Chris Forbes04b61da2016-11-03 09:53:59 +13002187 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002188
Chris Forbes04b61da2016-11-03 09:53:59 +13002189 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002190 result = my_data->dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002191
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002192 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002193 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002194
2195 return result;
2196}
2197
Chia-I Wu01ca2372016-05-13 14:37:49 +08002198VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002199 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002201 assert(my_data != NULL);
2202
Chris Forbes04b61da2016-11-03 09:53:59 +13002203 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002204
Chris Forbes04b61da2016-11-03 09:53:59 +13002205 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002206 my_data->dispatch_table.DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002207 }
2208}
2209
Chia-I Wu01ca2372016-05-13 14:37:49 +08002210VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002211 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002212 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002213 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2214 assert(my_data != NULL);
2215
Chris Forbes04b61da2016-11-03 09:53:59 +13002216 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002217
Chris Forbes04b61da2016-11-03 09:53:59 +13002218 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002219 result = my_data->dispatch_table.GetEventStatus(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002220
2221 validate_result(my_data->report_data, "vkGetEventStatus", result);
2222 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002223
2224 return result;
2225}
2226
Chia-I Wu01ca2372016-05-13 14:37:49 +08002227VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002228 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002229 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2231 assert(my_data != NULL);
2232
Chris Forbes04b61da2016-11-03 09:53:59 +13002233 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002234
Chris Forbes04b61da2016-11-03 09:53:59 +13002235 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002236 result = my_data->dispatch_table.SetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002237
2238 validate_result(my_data->report_data, "vkSetEvent", result);
2239 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002240
2241 return result;
2242}
2243
Chia-I Wu01ca2372016-05-13 14:37:49 +08002244VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002245 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002246 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002247 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2248 assert(my_data != NULL);
2249
Chris Forbes04b61da2016-11-03 09:53:59 +13002250 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002251
Chris Forbes04b61da2016-11-03 09:53:59 +13002252 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002253 result = my_data->dispatch_table.ResetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002254
2255 validate_result(my_data->report_data, "vkResetEvent", result);
2256 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002257
2258 return result;
2259}
2260
Chia-I Wu01ca2372016-05-13 14:37:49 +08002261VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002262 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002263 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002264 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002265 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2266 assert(device_data != nullptr);
2267 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002268
Chris Forbes04b61da2016-11-03 09:53:59 +13002269 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002270
Dustin Gravesc900f572016-05-16 11:07:59 -06002271 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2272 if (pCreateInfo != nullptr) {
2273 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2274 // VkQueryPipelineStatisticFlagBits values
2275 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2276 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002277 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002278 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2279 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2280 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2281 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2282 }
2283 }
2284
Chris Forbes04b61da2016-11-03 09:53:59 +13002285 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002286 result = device_data->dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002287
Dustin Gravesc900f572016-05-16 11:07:59 -06002288 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002289 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002290
2291 return result;
2292}
2293
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002294VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002295 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002296 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002297 assert(my_data != NULL);
2298
Chris Forbes04b61da2016-11-03 09:53:59 +13002299 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002300
Chris Forbes04b61da2016-11-03 09:53:59 +13002301 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002302 my_data->dispatch_table.DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002303 }
2304}
2305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002306VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2307 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002308 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002309 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002310 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002311 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002312
Chris Forbes04b61da2016-11-03 09:53:59 +13002313 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002314 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002315
Chris Forbes04b61da2016-11-03 09:53:59 +13002316 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002317 result = my_data->dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002318
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002319 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002320 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002321
2322 return result;
2323}
2324
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002325VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2326 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002328 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002329 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2330 assert(device_data != nullptr);
2331 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002332
Karl Schultza9ef1e52016-10-06 17:53:48 -06002333 // TODO: Add check for VALIDATION_ERROR_00660
2334 // TODO: Add check for VALIDATION_ERROR_00661
2335 // TODO: Add check for VALIDATION_ERROR_00662
2336 // TODO: Add check for VALIDATION_ERROR_00670
2337 // TODO: Add check for VALIDATION_ERROR_00671
2338 // TODO: Add check for VALIDATION_ERROR_00672
2339 // TODO: Add check for VALIDATION_ERROR_00673
2340 // TODO: Add check for VALIDATION_ERROR_00674
2341 // TODO: Add check for VALIDATION_ERROR_00675
2342 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2343 // TODO: Add check for VALIDATION_ERROR_00663
Chris Forbes04b61da2016-11-03 09:53:59 +13002344 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002345
Dustin Gravesc900f572016-05-16 11:07:59 -06002346 if (pCreateInfo != nullptr) {
2347 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2348 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2349 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2350 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002351 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002352 __LINE__, VALIDATION_ERROR_00665, LayerName,
2353 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2354 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2355 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002356 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002357
Dustin Gravesc900f572016-05-16 11:07:59 -06002358 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2359 // queueFamilyIndexCount uint32_t values
2360 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002361 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002362 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002363 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2364 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002365 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2366 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002367 }
2368
2369 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002370 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesc900f572016-05-16 11:07:59 -06002371 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2372 }
2373 }
2374
Chris Forbes04b61da2016-11-03 09:53:59 +13002375 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002376 result = device_data->dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002377
Dustin Gravesc900f572016-05-16 11:07:59 -06002378 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002379 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002380
2381 return result;
2382}
2383
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002384VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002385 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002386 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002387 assert(my_data != NULL);
2388
Chris Forbes04b61da2016-11-03 09:53:59 +13002389 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002390
Chris Forbes04b61da2016-11-03 09:53:59 +13002391 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002392 my_data->dispatch_table.DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002393 }
2394}
2395
Chia-I Wu01ca2372016-05-13 14:37:49 +08002396VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2397 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002398 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002399 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002400 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002401 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002402
Chris Forbes04b61da2016-11-03 09:53:59 +13002403 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002404
Chris Forbes04b61da2016-11-03 09:53:59 +13002405 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002406 result = my_data->dispatch_table.CreateBufferView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002407
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002408 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002409 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002410
2411 return result;
2412}
2413
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002414VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002415 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002416 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002417 assert(my_data != NULL);
2418
Chris Forbes04b61da2016-11-03 09:53:59 +13002419 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002420
Chris Forbes04b61da2016-11-03 09:53:59 +13002421 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002422 my_data->dispatch_table.DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002423 }
2424}
2425
Chia-I Wu01ca2372016-05-13 14:37:49 +08002426VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2427 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002428 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002429 bool skip = false;
Dustin Gravesf8032f22016-05-11 18:31:44 -06002430 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002431 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002432 debug_report_data *report_data = device_data->report_data;
2433
Chris Forbes04b61da2016-11-03 09:53:59 +13002434 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002435
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002436 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002437 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002438 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002439 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2440 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002441 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002442 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2443 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2444 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2445 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002446
Dustin Gravesc900f572016-05-16 11:07:59 -06002447 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2448 // queueFamilyIndexCount uint32_t values
2449 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002450 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002451 __LINE__, REQUIRED_PARAMETER, LayerName,
2452 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2453 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2454 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2455 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002456
Chris Forbes04b61da2016-11-03 09:53:59 +13002457 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesf8032f22016-05-11 18:31:44 -06002458 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2459 }
2460
2461 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002462 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2463 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002464 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002465 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002466
2467 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002468 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002469
2470 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002471 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002472
2473 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2474 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002475 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002476 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002477 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478 }
2479
2480 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2481 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2482 // extent.height must be equal
2483 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2484 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002485 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002486 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2487 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2488 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002489 }
2490
2491 if (pCreateInfo->extent.depth != 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002492 skip |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002493 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002494 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2495 }
2496 }
2497
2498 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2499 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2500 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002501 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002502 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2503 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2504 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002505 }
2506
2507 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2508 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2509 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2510 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002511 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002512 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2513 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2514 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002515 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002516 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002517
Chris Forbes04b61da2016-11-03 09:53:59 +13002518 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002519 result = device_data->dispatch_table.CreateImage(device, pCreateInfo, pAllocator, pImage);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002520
Dustin Gravesf8032f22016-05-11 18:31:44 -06002521 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002522 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002523
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002524 return result;
2525}
2526
Chia-I Wu01ca2372016-05-13 14:37:49 +08002527VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002528 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002529 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002530 assert(my_data != NULL);
2531
Chris Forbes04b61da2016-11-03 09:53:59 +13002532 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002533
Chris Forbes04b61da2016-11-03 09:53:59 +13002534 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002535 my_data->dispatch_table.DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002536 }
2537}
2538
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002539bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002540 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002541 if (pSubresource != nullptr) {
2542 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2543 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002544 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 -06002545 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002546 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2547 return false;
2548 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002549 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002550
2551 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002552}
2553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002554VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2555 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002556 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002557 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002558 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002559
Chris Forbes04b61da2016-11-03 09:53:59 +13002560 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002561
Chris Forbes04b61da2016-11-03 09:53:59 +13002562 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002563 PreGetImageSubresourceLayout(device, pSubresource);
2564
Chris Forbese58c9fe2016-11-24 14:44:17 +13002565 my_data->dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002566 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002567}
2568
Chia-I Wu01ca2372016-05-13 14:37:49 +08002569VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2570 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002571 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002572 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002573 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002574 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002575 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002576
Chris Forbes04b61da2016-11-03 09:53:59 +13002577 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002578
Dustin Graves0b70a632016-04-27 17:44:56 -06002579 if (pCreateInfo != nullptr) {
2580 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002581 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2582 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002583 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002584 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2585 "pCreateInfo->subresourceRange.layerCount must be 1",
2586 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2587 }
2588 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002589 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2590 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2591 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002592 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002593 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2594 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2595 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2596 }
2597 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002598 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2599 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002600 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002601 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2602 "pCreateInfo->subresourceRange.layerCount must be 6");
2603 }
2604 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002605 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2606 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002607 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002608 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2609 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2610 }
2611 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2612 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002613 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002614 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2615 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2616 }
2617
Dustin Graves2a80dc62016-07-12 13:57:02 -06002618 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2619 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002620 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002621 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2622 "pCreateInfo->subresourceRange.layerCount must be 1");
2623 }
2624 }
2625 }
2626
Chris Forbes04b61da2016-11-03 09:53:59 +13002627 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002628 result = my_data->dispatch_table.CreateImageView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002629
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002630 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002631 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002632
2633 return result;
2634}
2635
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002636VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002637 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002638 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002639 assert(my_data != NULL);
2640
Chris Forbes04b61da2016-11-03 09:53:59 +13002641 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002642
Chris Forbes04b61da2016-11-03 09:53:59 +13002643 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002644 my_data->dispatch_table.DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002645 }
2646}
2647
Chia-I Wu01ca2372016-05-13 14:37:49 +08002648VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002649 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002650 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002651 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002652 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002653 assert(my_data != NULL);
2654
Chris Forbes04b61da2016-11-03 09:53:59 +13002655 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002656
Chris Forbes04b61da2016-11-03 09:53:59 +13002657 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002658 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002659 my_data->dispatch_table.CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002660
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002661 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662 }
2663
Michael Lentine03d8e572015-09-15 14:59:14 -05002664 return result;
2665}
2666
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002667VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2668 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002669 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002671 assert(my_data != NULL);
2672
Chris Forbes04b61da2016-11-03 09:53:59 +13002673 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002674
Chris Forbes04b61da2016-11-03 09:53:59 +13002675 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002676 my_data->dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002677 }
2678}
2679
Chia-I Wu01ca2372016-05-13 14:37:49 +08002680VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002681 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002683 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002685 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002686
Chris Forbes04b61da2016-11-03 09:53:59 +13002687 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002688
Chris Forbes04b61da2016-11-03 09:53:59 +13002689 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002690 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002691 my_data->dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002692
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002693 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002694 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002695
2696 return result;
2697}
2698
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002699VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2700 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002701 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002702 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002703 assert(my_data != NULL);
2704
Chris Forbes04b61da2016-11-03 09:53:59 +13002705 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002706
Chris Forbes04b61da2016-11-03 09:53:59 +13002707 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002708 my_data->dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002709 }
2710}
2711
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002712VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2713 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002715 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002716 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002717 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002718
Chris Forbes04b61da2016-11-03 09:53:59 +13002719 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002720
Chris Forbes04b61da2016-11-03 09:53:59 +13002721 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002722 result = my_data->dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002723
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002724 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002725 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002726
2727 return result;
2728}
2729
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002730VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2731 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002732 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002733 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002734 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002735 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002736
Chris Forbes04b61da2016-11-03 09:53:59 +13002737 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002738
Chris Forbes04b61da2016-11-03 09:53:59 +13002739 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002740 result = my_data->dispatch_table.MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002741
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002742 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002743 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002744
2745 return result;
2746}
2747
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002748bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002749 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2750
2751 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002752 if (pCreateInfos != nullptr) {
2753 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2754 if (pCreateInfos->basePipelineIndex != -1) {
2755 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002756 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002757 VALIDATION_ERROR_00526, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002758 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2759 "pCreateInfos->flags "
Mike Weiblen9858d962016-10-31 23:59:10 -06002760 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2761 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002762 return false;
2763 }
2764 }
2765
2766 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2767 if (pCreateInfos->basePipelineIndex != -1) {
2768 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002769 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 -06002770 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002771 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2772 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06002773 "VK_NULL_HANDLE. %s",
2774 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002775 return false;
2776 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002777 }
2778 }
2779
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002780 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002781 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002782 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002783 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002784 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2785 "unrecognized enumerator");
2786 return false;
2787 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002788
2789 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2790 (data->physical_device_features.fillModeNonSolid == false)) {
2791 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002792 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 -06002793 DEVICE_FEATURE, LayerName,
2794 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2795 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2796 return false;
2797 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002798 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002799
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002800 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002801 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002802 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2803 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002804 pCreateInfos[i].pStages[j].pName);
2805 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002806 }
2807
2808 return true;
2809}
2810
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002811VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2812 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2813 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002814 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002815 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002816 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2817 assert(device_data != nullptr);
2818 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002819
Chris Forbes04b61da2016-11-03 09:53:59 +13002820 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002821 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002822
Dustin Gravesc900f572016-05-16 11:07:59 -06002823 if (pCreateInfos != nullptr) {
2824 for (uint32_t i = 0; i < createInfoCount; ++i) {
2825 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2826 if (pCreateInfos[i].pTessellationState == nullptr) {
2827 if (pCreateInfos[i].pStages != nullptr) {
2828 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2829 // pTessellationState must not be NULL
2830 bool has_control = false;
2831 bool has_eval = false;
2832
2833 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2834 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2835 has_control = true;
2836 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2837 has_eval = true;
2838 }
2839 }
2840
2841 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002842 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 -06002843 __LINE__, VALIDATION_ERROR_00536, LayerName,
2844 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2845 "control shader stage and a tessellation evaluation shader stage, "
2846 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
2847 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002848 }
2849 }
Dustin Graves629259b2016-05-30 16:14:27 -06002850 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002851 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002852 report_data, "vkCreateGraphicsPipelines",
2853 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2854 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002855
Chris Forbes04b61da2016-11-03 09:53:59 +13002856 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002857 report_data, "vkCreateGraphicsPipelines",
2858 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2859 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002860
2861 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002862 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 -06002863 __LINE__, VALIDATION_ERROR_00538, LayerName,
2864 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2865 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
2866 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06002867 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002868 }
2869
2870 if (pCreateInfos[i].pViewportState == nullptr) {
2871 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2872 // valid VkPipelineViewportStateCreateInfo structure
2873 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2874 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002875 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002876 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002877 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002878 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06002879 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
2880 "%s",
2881 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002882 }
2883 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002884 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002885 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2886 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2887 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002888
Chris Forbes04b61da2016-11-03 09:53:59 +13002889 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002890 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2891 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002892 pCreateInfos[i].pViewportState->flags);
2893
Dustin Gravesc900f572016-05-16 11:07:59 -06002894 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002895 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002896 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2897 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2898 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2899 i);
2900 }
2901
2902 if (pCreateInfos[i].pDynamicState != nullptr) {
2903 bool has_dynamic_viewport = false;
2904 bool has_dynamic_scissor = false;
2905
2906 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2907 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2908 has_dynamic_viewport = true;
2909 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2910 has_dynamic_scissor = true;
2911 }
2912 }
2913
2914 // viewportCount must be greater than 0
2915 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2916 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002917 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002918 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002919 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2920 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002921 "must be greater than 0",
2922 i, i);
2923 }
2924
2925 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2926 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2927 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002928 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002929 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 -06002930 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002931 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002932 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
2933 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002934 }
2935
2936 // scissorCount must be greater than 0
2937 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2938 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002939 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002940 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002941 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2942 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002943 "must be greater than 0",
2944 i, i);
2945 }
2946
2947 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2948 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2949 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002950 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002951 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 -06002952 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002953 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002954 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
2955 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002956 }
2957 }
2958 }
2959
2960 if (pCreateInfos[i].pMultisampleState == nullptr) {
2961 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2962 // a valid VkPipelineMultisampleStateCreateInfo structure
2963 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2964 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06002965 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2966 __LINE__, VALIDATION_ERROR_02114, LayerName,
2967 "vkCreateGraphicsPipelines: if "
2968 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2969 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
2970 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002971 }
Dustin Graves629259b2016-05-30 16:14:27 -06002972 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002973 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002974 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2975 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002976 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002977
Chris Forbes04b61da2016-11-03 09:53:59 +13002978 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002979 report_data, "vkCreateGraphicsPipelines",
2980 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2981 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002982
Chris Forbes04b61da2016-11-03 09:53:59 +13002983 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002984 report_data, "vkCreateGraphicsPipelines",
2985 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
2986 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002987
Chris Forbes04b61da2016-11-03 09:53:59 +13002988 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002989 report_data, "vkCreateGraphicsPipelines",
2990 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
2991 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
2992 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
2993 false);
Dustin Graves629259b2016-05-30 16:14:27 -06002994
Chris Forbes04b61da2016-11-03 09:53:59 +13002995 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002996 report_data, "vkCreateGraphicsPipelines",
2997 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
2998 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002999
Chris Forbes04b61da2016-11-03 09:53:59 +13003000 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003001 report_data, "vkCreateGraphicsPipelines",
3002 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3003 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003004
3005 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003006 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003007 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3008 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3009 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3010 i);
3011 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003012 }
3013
3014 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003015 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003016 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003017 report_data, "vkCreateGraphicsPipelines",
3018 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3019 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003020
Chris Forbes04b61da2016-11-03 09:53:59 +13003021 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003022 report_data, "vkCreateGraphicsPipelines",
3023 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3024 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003025
Chris Forbes04b61da2016-11-03 09:53:59 +13003026 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003027 report_data, "vkCreateGraphicsPipelines",
3028 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3029 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003030
Chris Forbes04b61da2016-11-03 09:53:59 +13003031 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003032 report_data, "vkCreateGraphicsPipelines",
3033 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3034 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003035
Chris Forbes04b61da2016-11-03 09:53:59 +13003036 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003037 report_data, "vkCreateGraphicsPipelines",
3038 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3039 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3040 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003041
Chris Forbes04b61da2016-11-03 09:53:59 +13003042 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003043 report_data, "vkCreateGraphicsPipelines",
3044 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3045 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003046
Chris Forbes04b61da2016-11-03 09:53:59 +13003047 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003048 report_data, "vkCreateGraphicsPipelines",
3049 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3050 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003051
Chris Forbes04b61da2016-11-03 09:53:59 +13003052 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003053 report_data, "vkCreateGraphicsPipelines",
3054 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3055 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3056 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003057
Chris Forbes04b61da2016-11-03 09:53:59 +13003058 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003059 report_data, "vkCreateGraphicsPipelines",
3060 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3061 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3062 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003063
Chris Forbes04b61da2016-11-03 09:53:59 +13003064 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003065 report_data, "vkCreateGraphicsPipelines",
3066 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3067 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3068 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003069
Chris Forbes04b61da2016-11-03 09:53:59 +13003070 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003071 report_data, "vkCreateGraphicsPipelines",
3072 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3073 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3074 pCreateInfos[i].pDepthStencilState->front.compareOp);
3075
Chris Forbes04b61da2016-11-03 09:53:59 +13003076 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003077 report_data, "vkCreateGraphicsPipelines",
3078 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003079 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3080
Chris Forbes04b61da2016-11-03 09:53:59 +13003081 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003082 report_data, "vkCreateGraphicsPipelines",
3083 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003084 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3085
Chris Forbes04b61da2016-11-03 09:53:59 +13003086 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003087 report_data, "vkCreateGraphicsPipelines",
3088 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3089 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3090 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003091
Chris Forbes04b61da2016-11-03 09:53:59 +13003092 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003093 report_data, "vkCreateGraphicsPipelines",
3094 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3095 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3096 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003097
3098 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003099 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003100 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3101 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3102 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3103 i);
3104 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003105 }
3106
3107 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3108 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003109 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003110 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3111 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3112 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003113
Chris Forbes04b61da2016-11-03 09:53:59 +13003114 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003115 report_data, "vkCreateGraphicsPipelines",
3116 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3117 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003118
Chris Forbes04b61da2016-11-03 09:53:59 +13003119 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003120 report_data, "vkCreateGraphicsPipelines",
3121 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3122 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003123
Chris Forbes04b61da2016-11-03 09:53:59 +13003124 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003125 report_data, "vkCreateGraphicsPipelines",
3126 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3127 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3128 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003129
3130 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3131 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3132 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003133 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003134 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3135 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3136 ParameterName::IndexVector{i, attachmentIndex}),
3137 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003138
Chris Forbes04b61da2016-11-03 09:53:59 +13003139 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003140 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003141 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3142 ParameterName::IndexVector{i, attachmentIndex}),
3143 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003144 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3145
Chris Forbes04b61da2016-11-03 09:53:59 +13003146 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003147 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003148 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3149 ParameterName::IndexVector{i, attachmentIndex}),
3150 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003151 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3152
Chris Forbes04b61da2016-11-03 09:53:59 +13003153 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003154 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3155 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3156 ParameterName::IndexVector{i, attachmentIndex}),
3157 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3158 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003159
Chris Forbes04b61da2016-11-03 09:53:59 +13003160 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003161 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003162 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3163 ParameterName::IndexVector{i, attachmentIndex}),
3164 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003165 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3166
Chris Forbes04b61da2016-11-03 09:53:59 +13003167 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003168 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003169 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3170 ParameterName::IndexVector{i, attachmentIndex}),
3171 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003172 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3173
Chris Forbes04b61da2016-11-03 09:53:59 +13003174 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003175 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3176 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3177 ParameterName::IndexVector{i, attachmentIndex}),
3178 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3179 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003180
Chris Forbes04b61da2016-11-03 09:53:59 +13003181 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003182 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003183 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3184 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003185 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3186 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3187 }
3188 }
3189
Dustin Gravesc900f572016-05-16 11:07:59 -06003190 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003191 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003192 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3193 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3194 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3195 i);
3196 }
3197
3198 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3199 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003200 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003201 report_data, "vkCreateGraphicsPipelines",
3202 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003203 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3204 }
3205 }
3206 }
3207 }
3208
Chris Forbes04b61da2016-11-03 09:53:59 +13003209 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003210 PreCreateGraphicsPipelines(device, pCreateInfos);
3211
Chris Forbese58c9fe2016-11-24 14:44:17 +13003212 result = device_data->dispatch_table.CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003213
Dustin Gravesc900f572016-05-16 11:07:59 -06003214 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003215 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003216
3217 return result;
3218}
3219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003220bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003221 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3222
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003223 if (pCreateInfos != nullptr) {
3224 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003225 uint32_t i = 0;
3226 validate_string(data->report_data, "vkCreateComputePipelines",
3227 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003228 }
3229
3230 return true;
3231}
3232
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003233VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3234 const VkComputePipelineCreateInfo *pCreateInfos,
3235 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003236 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003237 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003238 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003239 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003240
Chris Forbes04b61da2016-11-03 09:53:59 +13003241 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003242 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003243
Chris Forbes04b61da2016-11-03 09:53:59 +13003244 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003245 PreCreateComputePipelines(device, pCreateInfos);
3246
Chris Forbese58c9fe2016-11-24 14:44:17 +13003247 result = my_data->dispatch_table.CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003248
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003249 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003250 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003251
3252 return result;
3253}
3254
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003255VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003256 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003257 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003258 assert(my_data != NULL);
3259
Chris Forbes04b61da2016-11-03 09:53:59 +13003260 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003261
Chris Forbes04b61da2016-11-03 09:53:59 +13003262 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003263 my_data->dispatch_table.DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003264 }
3265}
3266
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003267VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3268 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003269 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003270 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003271 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003272 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003273
Chris Forbes04b61da2016-11-03 09:53:59 +13003274 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003275
Chris Forbes04b61da2016-11-03 09:53:59 +13003276 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003277 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003278 my_data->dispatch_table.CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003279
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003280 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003281 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003282
3283 return result;
3284}
3285
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003286VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3287 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003288 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003289 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003290 assert(my_data != NULL);
3291
Chris Forbes04b61da2016-11-03 09:53:59 +13003292 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003293
Chris Forbes04b61da2016-11-03 09:53:59 +13003294 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003295 my_data->dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003296 }
3297}
3298
Chia-I Wu01ca2372016-05-13 14:37:49 +08003299VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3300 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003301 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003302 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003303 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3304 assert(device_data != NULL);
3305 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003306
Chris Forbes04b61da2016-11-03 09:53:59 +13003307 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003308
Dustin Gravesc900f572016-05-16 11:07:59 -06003309 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3310 if (pCreateInfo != nullptr) {
3311 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3312 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003313 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003314 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3315 }
3316
3317 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3318 // valid VkBorderColor value
3319 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3320 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3321 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003322 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003323 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3324 }
3325 }
3326
Chris Forbes04b61da2016-11-03 09:53:59 +13003327 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003328 result = device_data->dispatch_table.CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003329
Dustin Gravesc900f572016-05-16 11:07:59 -06003330 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003331 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003332
3333 return result;
3334}
3335
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003336VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003337 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003338 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003339 assert(my_data != NULL);
3340
Chris Forbes04b61da2016-11-03 09:53:59 +13003341 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003342
Chris Forbes04b61da2016-11-03 09:53:59 +13003343 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003344 my_data->dispatch_table.DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003345 }
3346}
3347
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003348VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3349 const VkAllocationCallbacks *pAllocator,
3350 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003351 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003352 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003353 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3354 assert(device_data != nullptr);
3355 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003356
Chris Forbes04b61da2016-11-03 09:53:59 +13003357 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003358
Dustin Gravesc900f572016-05-16 11:07:59 -06003359 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3360 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3361 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3362 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3363 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3364 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3365 // valid VkSampler handles
3366 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3367 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3368 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3369 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3370 ++descriptor_index) {
3371 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003372 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003373 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3374 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3375 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3376 " specified as VK_NULL_HANDLE",
3377 i, descriptor_index);
3378 }
3379 }
3380 }
3381
3382 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3383 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3384 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003385 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003386 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3387 UNRECOGNIZED_VALUE, LayerName,
3388 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3389 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3390 i, i);
3391 }
3392 }
3393 }
3394 }
3395
Chris Forbes04b61da2016-11-03 09:53:59 +13003396 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003397 result = device_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003398
Dustin Gravesc900f572016-05-16 11:07:59 -06003399 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003400 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003401
3402 return result;
3403}
3404
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003405VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3406 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003407 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003408 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003409 assert(my_data != NULL);
3410
Chris Forbes04b61da2016-11-03 09:53:59 +13003411 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003412
Chris Forbes04b61da2016-11-03 09:53:59 +13003413 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003414 my_data->dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003415 }
3416}
3417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003418VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3419 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003420 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003421 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003422 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003423 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003424
Chris Forbes04b61da2016-11-03 09:53:59 +13003425 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003426
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003427 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3428
Chris Forbes04b61da2016-11-03 09:53:59 +13003429 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003430 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003431 my_data->dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003432
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003433 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003434 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003435
3436 return result;
3437}
3438
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003439VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3440 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003441 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003442 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003443 assert(my_data != NULL);
3444
Chris Forbes04b61da2016-11-03 09:53:59 +13003445 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003446
Chris Forbes04b61da2016-11-03 09:53:59 +13003447 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003448 my_data->dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003449 }
3450}
3451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003452VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3453 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003454 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003455 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003456 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3457 assert(my_data != NULL);
3458
Chris Forbes04b61da2016-11-03 09:53:59 +13003459 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003460
Chris Forbes04b61da2016-11-03 09:53:59 +13003461 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003462 result = my_data->dispatch_table.ResetDescriptorPool(device, descriptorPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003463
3464 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3465 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003466
3467 return result;
3468}
3469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003470VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3471 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003472 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003473 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003474 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003475 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003476
Chris Forbes04b61da2016-11-03 09:53:59 +13003477 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003478
Chris Forbes04b61da2016-11-03 09:53:59 +13003479 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003480 result = my_data->dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003481
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003482 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003483 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003484
3485 return result;
3486}
3487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003488VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003489 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003490 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003491 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003492 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3493 assert(device_data != nullptr);
3494 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003495
Chris Forbes04b61da2016-11-03 09:53:59 +13003496 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003497
Dustin Gravesc900f572016-05-16 11:07:59 -06003498 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3499 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3500 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003501 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003502 pDescriptorSets, true, true);
3503
Chris Forbes04b61da2016-11-03 09:53:59 +13003504 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003505 result = device_data->dispatch_table.FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003506
Dustin Gravesc900f572016-05-16 11:07:59 -06003507 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003508 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003509
3510 return result;
3511}
3512
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003513VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3514 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3515 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003516 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003517 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3518 assert(device_data != NULL);
3519 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003520
Chris Forbes04b61da2016-11-03 09:53:59 +13003521 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003522 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003523
Dustin Gravesc900f572016-05-16 11:07:59 -06003524 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3525 if (pDescriptorWrites != NULL) {
3526 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3527 // descriptorCount must be greater than 0
3528 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003529 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003530 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3531 REQUIRED_PARAMETER, LayerName,
3532 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3533 }
3534
3535 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3536 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3537 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3538 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3539 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3540 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3541 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3542 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3543 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003544 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003545 __LINE__, REQUIRED_PARAMETER, LayerName,
3546 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3547 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3548 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3549 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3550 i, i);
3551 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3552 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3553 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3554 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3555 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3556 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003557 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003558 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3559 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003560 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003561 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003562 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3563 ParameterName::IndexVector{i, descriptor_index}),
3564 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003565 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3566 }
3567 }
3568 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3569 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3570 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3571 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3572 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3573 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3574 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3575 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003576 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003577 __LINE__, REQUIRED_PARAMETER, LayerName,
3578 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3579 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3580 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3581 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3582 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003583 } else {
3584 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003585 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003586 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3587 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003588 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3589 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003590 }
3591 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3592 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3593 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3594 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3595 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003596 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003597 __LINE__, REQUIRED_PARAMETER, LayerName,
3598 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3599 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3600 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3601 i, i);
3602 } else {
3603 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3604 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003605 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003606 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3607 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003608 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3609 }
3610 }
3611 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003612
3613 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3614 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3615 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3616 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3617 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3618 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003619 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003620 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003621 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003622 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3623 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3624 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3625 }
3626 }
3627 }
3628 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3629 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3630 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3631 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3632 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3633 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003634 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003635 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003636 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003637 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3638 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3639 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3640 }
3641 }
3642 }
3643 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003644 }
3645 }
3646
Chris Forbes04b61da2016-11-03 09:53:59 +13003647 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003648 device_data->dispatch_table.UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003649 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003650}
3651
Chia-I Wu01ca2372016-05-13 14:37:49 +08003652VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003653 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003654 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003655 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003656 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003657 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003658
Chris Forbes04b61da2016-11-03 09:53:59 +13003659 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003660
Chris Forbes04b61da2016-11-03 09:53:59 +13003661 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003662 result = my_data->dispatch_table.CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003663
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003664 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003665 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003666
3667 return result;
3668}
3669
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003670VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003671 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003672 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003673 assert(my_data != NULL);
3674
Chris Forbes04b61da2016-11-03 09:53:59 +13003675 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003676
Chris Forbes04b61da2016-11-03 09:53:59 +13003677 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003678 my_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003679 }
3680}
3681
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003682bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003683 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003684 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3685
3686 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3687 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003688 skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003689 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003690 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3691 }
3692 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003693 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003694}
3695
Chia-I Wu01ca2372016-05-13 14:37:49 +08003696VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003697 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003698 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003699 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003700 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003701 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003702
Chris Forbes04b61da2016-11-03 09:53:59 +13003703 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3704 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003705
Chris Forbes04b61da2016-11-03 09:53:59 +13003706 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003707 result = my_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003708
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003709 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003710 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003711
3712 return result;
3713}
3714
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003715VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003716 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003717 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003718 assert(my_data != NULL);
3719
Chris Forbes04b61da2016-11-03 09:53:59 +13003720 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003721
Chris Forbes04b61da2016-11-03 09:53:59 +13003722 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003723 my_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003724 }
3725}
3726
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003727VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003728 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003729 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003730 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003731
Chris Forbes04b61da2016-11-03 09:53:59 +13003732 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003733
Chris Forbes04b61da2016-11-03 09:53:59 +13003734 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003735 my_data->dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003736 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003737}
3738
Chia-I Wu01ca2372016-05-13 14:37:49 +08003739VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003740 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003741 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003742 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003744 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003745
Chris Forbes04b61da2016-11-03 09:53:59 +13003746 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003747 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003748
Chris Forbes04b61da2016-11-03 09:53:59 +13003749 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003750
Chris Forbes04b61da2016-11-03 09:53:59 +13003751 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003752 result = my_data->dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003753
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003754 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003756
3757 return result;
3758}
3759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003760VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003761 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003763 assert(my_data != NULL);
3764
Chris Forbes04b61da2016-11-03 09:53:59 +13003765 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003766
Chris Forbes04b61da2016-11-03 09:53:59 +13003767 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003768 my_data->dispatch_table.DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003769 }
3770}
3771
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003772VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003774 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3776 assert(my_data != NULL);
3777
Chris Forbes04b61da2016-11-03 09:53:59 +13003778 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003779
Chris Forbes04b61da2016-11-03 09:53:59 +13003780 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003781 result = my_data->dispatch_table.ResetCommandPool(device, commandPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003782
3783 validate_result(my_data->report_data, "vkResetCommandPool", result);
3784 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003785
3786 return result;
3787}
3788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003789VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3790 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003791 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003792 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003793 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003794 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003795
Chris Forbes04b61da2016-11-03 09:53:59 +13003796 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003797
Chris Forbes04b61da2016-11-03 09:53:59 +13003798 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003799 result = my_data->dispatch_table.AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003800
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003801 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003802 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003803
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003804 return result;
3805}
3806
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003807VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003808 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003809 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003810 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3811 assert(device_data != nullptr);
3812 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003813
Chris Forbes04b61da2016-11-03 09:53:59 +13003814 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003815
Dustin Gravesc900f572016-05-16 11:07:59 -06003816 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3817 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3818 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003819 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003820 pCommandBuffers, true, true);
3821
Chris Forbes04b61da2016-11-03 09:53:59 +13003822 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003823 device_data->dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003824 }
3825}
3826
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003827bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003828 bool skip = false;
Chris Forbese58c9fe2016-11-24 14:44:17 +13003829 // TODO: this makes no sense.
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003830 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3831 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3832
3833 if (pInfo != NULL) {
3834 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003835 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003836 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003837 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003838 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3839 "inheritedQueries.");
3840 }
3841
3842 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3843 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003844 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003845 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003846 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003847 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3848 "valid combination of VkQueryControlFlagBits.",
3849 pInfo->queryFlags);
3850 }
3851 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003852 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003853}
3854
3855VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003856 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003857 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003858 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3859 assert(device_data != nullptr);
3860 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003861
Chris Forbes04b61da2016-11-03 09:53:59 +13003862 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003863
Dustin Gravesc900f572016-05-16 11:07:59 -06003864 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3865 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003866 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003867 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3868 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3869
3870 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003871 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003872 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003873
Chris Forbes04b61da2016-11-03 09:53:59 +13003874 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003875 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3876
Dustin Gravesc900f572016-05-16 11:07:59 -06003877 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003878 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003879 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3880
3881 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003882 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003883 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3884 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3885 }
3886
Chris Forbes04b61da2016-11-03 09:53:59 +13003887 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003888
Chris Forbes04b61da2016-11-03 09:53:59 +13003889 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003890 result = device_data->dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003891
Dustin Gravesc900f572016-05-16 11:07:59 -06003892 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003893 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003894
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003895 return result;
3896}
3897
Chia-I Wu01ca2372016-05-13 14:37:49 +08003898VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003899 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3900 assert(my_data != NULL);
3901
Chris Forbese58c9fe2016-11-24 14:44:17 +13003902 VkResult result = my_data->dispatch_table.EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003903
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003904 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003905
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003906 return result;
3907}
3908
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003909VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003910 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003911 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3912 assert(my_data != NULL);
3913
Chris Forbes04b61da2016-11-03 09:53:59 +13003914 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003915
Chris Forbes04b61da2016-11-03 09:53:59 +13003916 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003917 result = my_data->dispatch_table.ResetCommandBuffer(commandBuffer, flags);
Dustin Graves16d18972016-05-09 17:36:57 -06003918
3919 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3920 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003921
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003922 return result;
3923}
3924
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003925VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3926 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003927 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003928 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3929 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003930
Chris Forbes04b61da2016-11-03 09:53:59 +13003931 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003932
Chris Forbes04b61da2016-11-03 09:53:59 +13003933 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003934 my_data->dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003935 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003936}
3937
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003938bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3939 debug_report_data *report_data = my_data->report_data;
3940
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003941 bool skip =
3942 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003943
3944 if (viewport_count > 0 && viewports != nullptr) {
3945 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3946 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3947 const VkViewport &viewport = viewports[viewportIndex];
3948
3949 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3950 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3951 VALIDATION_ERROR_01448, LayerName,
3952 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3953 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3954 }
3955
3956 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3957 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3958 // VALIDATION_ERROR_01790
3959 invalid_height = false;
3960 }
3961 if (invalid_height) {
3962 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3963 VALIDATION_ERROR_01449, LayerName,
3964 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3965 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3966 }
3967
3968 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3969 skip |=
3970 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3971 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3972 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3973 validation_error_map[VALIDATION_ERROR_01450]);
3974 }
3975
3976 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
3977 skip |=
3978 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3979 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
3980 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3981 validation_error_map[VALIDATION_ERROR_01450]);
3982 }
3983
3984 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
3985 skip |=
3986 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3987 VALIDATION_ERROR_01451, LayerName,
3988 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
3989 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
3990 }
3991
3992 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
3993 skip |=
3994 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3995 VALIDATION_ERROR_01452, LayerName,
3996 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
3997 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
3998 }
3999 }
4000 }
4001
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004002 return skip;
4003}
4004
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004005VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4006 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004007 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004008 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004009 assert(my_data != NULL);
4010
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004011 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004012
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004013 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004014 my_data->dispatch_table.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004015 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004016}
4017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004018VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4019 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004020 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004022 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004023 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004024
Chris Forbes04b61da2016-11-03 09:53:59 +13004025 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004026
Mike Weiblena4742dc2016-10-31 11:05:56 -06004027 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4028 const VkRect2D &pScissor = pScissors[scissorIndex];
4029
4030 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004031 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004032 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4033 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4034 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004035 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004036 VALIDATION_ERROR_01490, LayerName,
4037 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4038 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4039 }
4040
4041 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004042 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004043 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4044 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4045 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004046 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004047 VALIDATION_ERROR_01491, LayerName,
4048 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4049 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4050 }
4051 }
4052
Chris Forbes04b61da2016-11-03 09:53:59 +13004053 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004054 my_data->dispatch_table.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004055 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004056}
4057
Chia-I Wu01ca2372016-05-13 14:37:49 +08004058VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004059 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4060 my_data->dispatch_table.CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004061}
4062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004063VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4064 float depthBiasSlopeFactor) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4066 my_data->dispatch_table.CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004067}
4068
Chia-I Wu01ca2372016-05-13 14:37:49 +08004069VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004070 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004071 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004072 assert(my_data != NULL);
4073
Chris Forbes04b61da2016-11-03 09:53:59 +13004074 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004075
Chris Forbes04b61da2016-11-03 09:53:59 +13004076 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004077 my_data->dispatch_table.CmdSetBlendConstants(commandBuffer, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004078 }
Cody Northrop12365112015-08-17 11:10:49 -06004079}
4080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004081VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004082 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4083 my_data->dispatch_table.CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004084}
4085
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004086VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4087 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004088 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004089 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4090 assert(my_data != NULL);
4091
Chris Forbes04b61da2016-11-03 09:53:59 +13004092 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004093
Chris Forbes04b61da2016-11-03 09:53:59 +13004094 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004095 my_data->dispatch_table.CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004096 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004097}
4098
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004099VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4102 assert(my_data != NULL);
4103
Chris Forbes04b61da2016-11-03 09:53:59 +13004104 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004105
Chris Forbes04b61da2016-11-03 09:53:59 +13004106 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004107 my_data->dispatch_table.CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004108 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004109}
4110
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004111VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004112 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004113 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4114 assert(my_data != NULL);
4115
Chris Forbes04b61da2016-11-03 09:53:59 +13004116 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004117
Chris Forbes04b61da2016-11-03 09:53:59 +13004118 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004119 my_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004120 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004121}
4122
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004123VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4124 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4125 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4126 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004127 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004128 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004129 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004130
Chris Forbes04b61da2016-11-03 09:53:59 +13004131 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004132 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4133 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004134
Chris Forbes04b61da2016-11-03 09:53:59 +13004135 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004136 my_data->dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004137 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004138 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004139}
4140
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004141VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4142 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004143 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4145 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004146
Chris Forbes04b61da2016-11-03 09:53:59 +13004147 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004148
Chris Forbes04b61da2016-11-03 09:53:59 +13004149 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004150 my_data->dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004151 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004152}
4153
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004154VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4155 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004156 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004158 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004159
Chris Forbes04b61da2016-11-03 09:53:59 +13004160 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004161
Chris Forbes04b61da2016-11-03 09:53:59 +13004162 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004163 my_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004164 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004165}
4166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004167bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4168 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004169 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004170 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004171 // TODO: Verify against Valid Usage section. I don't see a non-zero vertexCount listed, may need to add that and make
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004172 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004173 log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004174 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004175 return false;
4176 }
4177
4178 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004179 // TODO: Verify against Valid Usage section. I don't see a non-zero instanceCount listed, may need to add that and make
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004180 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004181 log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004182 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004183 return false;
4184 }
4185
4186 return true;
4187}
4188
Chia-I Wu01ca2372016-05-13 14:37:49 +08004189VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4190 uint32_t firstVertex, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004191 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004192 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004193
Chris Forbese58c9fe2016-11-24 14:44:17 +13004194 my_data->dispatch_table.CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004195}
4196
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004197VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4198 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004199 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4200 my_data->dispatch_table.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004201}
4202
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004203VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4204 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004205 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004206 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4207 assert(my_data != NULL);
4208
Chris Forbes04b61da2016-11-03 09:53:59 +13004209 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004210
Chris Forbes04b61da2016-11-03 09:53:59 +13004211 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004212 my_data->dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004213 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004214}
4215
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004216VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4217 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004218 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004219 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4220 assert(my_data != NULL);
4221
Chris Forbes04b61da2016-11-03 09:53:59 +13004222 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004223
Chris Forbes04b61da2016-11-03 09:53:59 +13004224 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004225 my_data->dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004226 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004227}
4228
Chia-I Wu01ca2372016-05-13 14:37:49 +08004229VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4231 my_data->dispatch_table.CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004232}
4233
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004234VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004235 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4237 assert(my_data != NULL);
4238
Chris Forbes04b61da2016-11-03 09:53:59 +13004239 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004240
Chris Forbes04b61da2016-11-03 09:53:59 +13004241 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004242 my_data->dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004243 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004244}
4245
Chia-I Wu01ca2372016-05-13 14:37:49 +08004246VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4247 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004248 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004250 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004251
Chris Forbes04b61da2016-11-03 09:53:59 +13004252 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004253
Chris Forbes04b61da2016-11-03 09:53:59 +13004254 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004255 my_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004256 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004257}
4258
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004259bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261 if (pRegions != nullptr) {
4262 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4263 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004264 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004265 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004266 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4267 return false;
4268 }
4269 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4270 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004271 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004272 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004273 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4274 return false;
4275 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004276 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004277
4278 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004279}
4280
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004281VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4282 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4283 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004284 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004285 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004286 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004287
Chris Forbes04b61da2016-11-03 09:53:59 +13004288 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004289 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004290
Chris Forbes04b61da2016-11-03 09:53:59 +13004291 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004292 PreCmdCopyImage(commandBuffer, pRegions);
4293
Chris Forbese58c9fe2016-11-24 14:44:17 +13004294 my_data->dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004295 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004296}
4297
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004298bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004299 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004300 if (pRegions != nullptr) {
4301 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4302 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004303 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004304 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004305 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4306 return false;
4307 }
4308 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4309 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004310 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004311 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004312 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4313 return false;
4314 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004315 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004316
4317 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004318}
4319
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004320VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4321 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4322 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004323 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004325 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004326
Chris Forbes04b61da2016-11-03 09:53:59 +13004327 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004328 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004329
Chris Forbes04b61da2016-11-03 09:53:59 +13004330 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004331 PreCmdBlitImage(commandBuffer, pRegions);
4332
Chris Forbese58c9fe2016-11-24 14:44:17 +13004333 my_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004334 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004335}
4336
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004337bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004338 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004339 if (pRegions != nullptr) {
4340 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4341 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004342 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004343 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004344 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4345 "enumerator");
4346 return false;
4347 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004348 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004349
4350 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004351}
4352
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004353VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4354 VkImageLayout dstImageLayout, uint32_t regionCount,
4355 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004356 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004357 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004358 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004359
Chris Forbes04b61da2016-11-03 09:53:59 +13004360 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004361 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004362
Chris Forbes04b61da2016-11-03 09:53:59 +13004363 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004364 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4365
Chris Forbese58c9fe2016-11-24 14:44:17 +13004366 my_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004367 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004368}
4369
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004370bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004371 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004372 if (pRegions != nullptr) {
4373 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4374 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004375 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004376 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004377 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4378 "enumerator");
4379 return false;
4380 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004381 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004382
4383 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004384}
4385
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004386VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4387 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004388 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004389 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004390 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004391
Chris Forbes04b61da2016-11-03 09:53:59 +13004392 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004393 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004394
Chris Forbes04b61da2016-11-03 09:53:59 +13004395 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004396 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4397
Chris Forbese58c9fe2016-11-24 14:44:17 +13004398 my_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004399 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004400}
4401
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004402VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4403 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004404 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004405 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004406 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004407
Chris Forbes04b61da2016-11-03 09:53:59 +13004408 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004409
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004410 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004411 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004412 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4413 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004414 }
4415
4416 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004417 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004418 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4419 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004420 dataSize);
4421 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004422 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004423 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4424 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004425 }
4426
Chris Forbes04b61da2016-11-03 09:53:59 +13004427 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004428 my_data->dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004429 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004430}
4431
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004432VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4433 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004434 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004435 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4436 assert(my_data != NULL);
4437
Chris Forbes04b61da2016-11-03 09:53:59 +13004438 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004439
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004440 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004441 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004442 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4443 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004444 }
4445
4446 if (size != VK_WHOLE_SIZE) {
4447 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004448 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004449 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004450 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004451 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004452 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004453 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004454 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4455 }
4456 }
4457
Chris Forbes04b61da2016-11-03 09:53:59 +13004458 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004459 my_data->dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004460 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004461}
4462
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004463VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4464 const VkClearColorValue *pColor, uint32_t rangeCount,
4465 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004466 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004468 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004469
Chris Forbes04b61da2016-11-03 09:53:59 +13004470 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004471
Chris Forbes04b61da2016-11-03 09:53:59 +13004472 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004473 my_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004474 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004475}
4476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004477VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4478 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4479 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004480 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004481 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004482 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004483
Chris Forbes04b61da2016-11-03 09:53:59 +13004484 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004485 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004486
Chris Forbes04b61da2016-11-03 09:53:59 +13004487 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004488 my_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004490}
4491
Chia-I Wu01ca2372016-05-13 14:37:49 +08004492VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4493 const VkClearAttachment *pAttachments, uint32_t rectCount,
4494 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004495 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004496 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004497 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004498
Chris Forbes04b61da2016-11-03 09:53:59 +13004499 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004500
Chris Forbes04b61da2016-11-03 09:53:59 +13004501 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004502 my_data->dispatch_table.CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004503 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004504}
4505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004506bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004507 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004508 if (pRegions != nullptr) {
4509 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4510 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4511 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004512 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004513 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004514 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4515 return false;
4516 }
4517 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4518 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4519 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004520 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004521 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004522 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4523 return false;
4524 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004525 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004526
4527 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004528}
4529
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004530VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4531 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4532 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004533 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004534 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004535 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004536
Chris Forbes04b61da2016-11-03 09:53:59 +13004537 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004538 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004539
Chris Forbes04b61da2016-11-03 09:53:59 +13004540 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004541 PreCmdResolveImage(commandBuffer, pRegions);
4542
Chris Forbese58c9fe2016-11-24 14:44:17 +13004543 my_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004544 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004545}
4546
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004547VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004548 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004549 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4550 assert(my_data != NULL);
4551
Chris Forbes04b61da2016-11-03 09:53:59 +13004552 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004553
Chris Forbes04b61da2016-11-03 09:53:59 +13004554 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004555 my_data->dispatch_table.CmdSetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004556 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004557}
4558
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004559VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004560 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004561 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4562 assert(my_data != NULL);
4563
Chris Forbes04b61da2016-11-03 09:53:59 +13004564 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004565
Chris Forbes04b61da2016-11-03 09:53:59 +13004566 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004567 my_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004568 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004569}
4570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004571VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4572 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4573 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4574 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4575 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004576 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004577 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004578 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004579
Chris Forbes04b61da2016-11-03 09:53:59 +13004580 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004581 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4582 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004583
Chris Forbes04b61da2016-11-03 09:53:59 +13004584 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004585 my_data->dispatch_table.CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004586 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004587 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004588}
4589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004590VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4591 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4592 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4593 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4594 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004595 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004596 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004597 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004598
Chris Forbes04b61da2016-11-03 09:53:59 +13004599 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004600 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4601 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004602
Chris Forbes04b61da2016-11-03 09:53:59 +13004603 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004604 my_data->dispatch_table.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004605 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004606 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004607}
4608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004609VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4610 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004611 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004612 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4613 assert(my_data != NULL);
4614
Chris Forbes04b61da2016-11-03 09:53:59 +13004615 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004616
Chris Forbes04b61da2016-11-03 09:53:59 +13004617 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004618 my_data->dispatch_table.CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004619 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004620}
4621
Chia-I Wu01ca2372016-05-13 14:37:49 +08004622VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004623 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004624 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4625 assert(my_data != NULL);
4626
Chris Forbes04b61da2016-11-03 09:53:59 +13004627 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004628
Chris Forbes04b61da2016-11-03 09:53:59 +13004629 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004630 my_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004631 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004632}
4633
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004634VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4635 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004636 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004637 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4638 assert(my_data != NULL);
4639
Chris Forbes04b61da2016-11-03 09:53:59 +13004640 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004641
Chris Forbes04b61da2016-11-03 09:53:59 +13004642 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004643 my_data->dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004644 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004645}
4646
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004647bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4648 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004649
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004650 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004651
4652 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004653}
4654
Chia-I Wu01ca2372016-05-13 14:37:49 +08004655VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4656 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004657 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4659 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004660
Chris Forbes04b61da2016-11-03 09:53:59 +13004661 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004662
Chris Forbes04b61da2016-11-03 09:53:59 +13004663 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004664 my_data->dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004665
4666 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4667 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004668}
4669
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004670VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4671 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4672 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004673 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004674 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4675 assert(my_data != NULL);
4676
Chris Forbes04b61da2016-11-03 09:53:59 +13004677 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004678 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004679
Chris Forbes04b61da2016-11-03 09:53:59 +13004680 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004681 my_data->dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004682 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004683}
4684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004685VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4686 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004687 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004689 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004690
Chris Forbes04b61da2016-11-03 09:53:59 +13004691 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004692
Chris Forbes04b61da2016-11-03 09:53:59 +13004693 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004694 my_data->dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004695 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004696}
4697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004698VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4699 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004700 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004701 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004702 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004703
Chris Forbes04b61da2016-11-03 09:53:59 +13004704 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004705
Chris Forbes04b61da2016-11-03 09:53:59 +13004706 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004707 my_data->dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004708 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004709}
4710
Chia-I Wu01ca2372016-05-13 14:37:49 +08004711VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004712 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004713 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4714 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004715
Chris Forbes04b61da2016-11-03 09:53:59 +13004716 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004717
Chris Forbes04b61da2016-11-03 09:53:59 +13004718 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004719 my_data->dispatch_table.CmdNextSubpass(commandBuffer, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004720 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004721}
4722
Chia-I Wu01ca2372016-05-13 14:37:49 +08004723VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4725 my_data->dispatch_table.CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004726}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004727
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004728VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4729 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004730 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004731 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004732 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004733
Chris Forbes04b61da2016-11-03 09:53:59 +13004734 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004735
Chris Forbes04b61da2016-11-03 09:53:59 +13004736 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004737 my_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004738 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004739}
4740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004741VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004742 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4743}
4744
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004745VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4746 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004747 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4748}
4749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004750VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4751 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004752 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4753 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4754
4755 return VK_ERROR_LAYER_NOT_PRESENT;
4756}
4757
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004758VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4759 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004760 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004761 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004762 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004763
4764 assert(physicalDevice);
4765
Chris Forbes6444bba2016-11-24 14:15:23 +13004766 return get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map)
4767 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004768}
4769
Chris Forbes448ebcb2016-11-03 09:29:52 +13004770bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4771{
4772 if (!(my_data->*flag)) {
4773 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4774 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4775 "%s() called even though the %s extension was not enabled for this VkDevice.",
4776 function_name, extension_name);
4777 }
4778
4779 return false;
4780}
4781
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004782// WSI Extension Functions
4783
4784VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004785 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004786 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004787 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004788 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4789 assert(my_data != NULL);
4790
Chris Forbes04b61da2016-11-03 09:53:59 +13004791 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004792
Chris Forbes04b61da2016-11-03 09:53:59 +13004793 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004794
Chris Forbes04b61da2016-11-03 09:53:59 +13004795 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004796 result = my_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004797
4798 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4799 }
4800
4801 return result;
4802}
4803
4804VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004805 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004806 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004807 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004808 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4809 assert(my_data != NULL);
4810
Chris Forbes04b61da2016-11-03 09:53:59 +13004811 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004812
Chris Forbes04b61da2016-11-03 09:53:59 +13004813 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004814 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4815
Chris Forbes04b61da2016-11-03 09:53:59 +13004816 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004817 result = my_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004818
4819 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4820 }
4821
4822 return result;
4823}
4824
4825VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004826 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004827 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004828 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004829 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4830 assert(my_data != NULL);
4831
Chris Forbes04b61da2016-11-03 09:53:59 +13004832 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004833
Chris Forbes04b61da2016-11-03 09:53:59 +13004834 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004835 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4836
Chris Forbes04b61da2016-11-03 09:53:59 +13004837 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004838 result = my_data->dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004839
4840 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4841 }
4842
4843 return result;
4844}
4845
4846VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4847 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004848 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004849 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4850 assert(my_data != NULL);
4851
Chris Forbes04b61da2016-11-03 09:53:59 +13004852 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004853
Chris Forbes04b61da2016-11-03 09:53:59 +13004854 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004855
Chris Forbes04b61da2016-11-03 09:53:59 +13004856 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004857 result = my_data->dispatch_table.QueuePresentKHR(queue, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004858
4859 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4860 }
4861
4862 return result;
4863}
4864
Chris Forbesbe5f5202016-11-02 18:34:25 +13004865VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004866 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004867 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4868 assert(my_data != NULL);
4869
Chris Forbes04b61da2016-11-03 09:53:59 +13004870 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004871
4872 /* No generated validation function for this call */
4873
Chris Forbes04b61da2016-11-03 09:53:59 +13004874 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004875 my_data->dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004876 }
4877}
4878
Chris Forbes115f98c2016-11-03 09:51:48 +13004879bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4880{
Chris Forbes6be763e2016-11-24 12:42:33 +13004881 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
4882 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13004883 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4884 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4885 "%s() called even though the %s extension was not enabled for this VkInstance.",
4886 function_name, extension_name);
4887 }
4888
4889 return false;
4890}
4891
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004892VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4893 VkSurfaceKHR surface, VkBool32 *pSupported) {
4894 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004895 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004896 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004897 assert(my_data != NULL);
4898
Chris Forbes04b61da2016-11-03 09:53:59 +13004899 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004900 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004901
Chris Forbes04b61da2016-11-03 09:53:59 +13004902 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004903 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4904
Chris Forbes04b61da2016-11-03 09:53:59 +13004905 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004906 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004907
4908 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4909 }
4910
4911 return result;
4912}
4913
4914VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4915 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4916 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004917 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004918 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004919 assert(my_data != NULL);
4920
Chris Forbes04b61da2016-11-03 09:53:59 +13004921 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004922 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004923
Chris Forbes04b61da2016-11-03 09:53:59 +13004924 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004925 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004926
Chris Forbes04b61da2016-11-03 09:53:59 +13004927 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004928 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004929
4930 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4931 }
4932
4933 return result;
4934}
4935
4936VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4937 uint32_t *pSurfaceFormatCount,
4938 VkSurfaceFormatKHR *pSurfaceFormats) {
4939 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004940 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004941 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 assert(my_data != NULL);
4943
Chris Forbes04b61da2016-11-03 09:53:59 +13004944 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004945 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004946
Chris Forbes04b61da2016-11-03 09:53:59 +13004947 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004948 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949
Chris Forbes04b61da2016-11-03 09:53:59 +13004950 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004951 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
4952 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953
4954 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4955 }
4956
4957 return result;
4958}
4959
4960VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4961 uint32_t *pPresentModeCount,
4962 VkPresentModeKHR *pPresentModes) {
4963 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004964 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004965 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004966 assert(my_data != NULL);
4967
Chris Forbes04b61da2016-11-03 09:53:59 +13004968 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004969 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004970
Chris Forbes04b61da2016-11-03 09:53:59 +13004971 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004972 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973
Chris Forbes04b61da2016-11-03 09:53:59 +13004974 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004975 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
4976 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004977
4978 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4979 }
4980
4981 return result;
4982}
4983
Chris Forbesbe5f5202016-11-02 18:34:25 +13004984VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004985 bool skip = false;
Chris Forbes6444bba2016-11-24 14:15:23 +13004986 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004987
Chris Forbes04b61da2016-11-03 09:53:59 +13004988 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004989 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004990
Chris Forbes04b61da2016-11-03 09:53:59 +13004991 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004992 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004993 }
4994}
4995
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004996#ifdef VK_USE_PLATFORM_WIN32_KHR
4997VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4998 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4999 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5000
Chris Forbes7b58a712016-11-24 11:35:31 +13005001 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005002 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005003 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005004
Chris Forbes04b61da2016-11-03 09:53:59 +13005005 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005006 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005007
Chris Forbes04b61da2016-11-03 09:53:59 +13005008 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005009
Chris Forbes04b61da2016-11-03 09:53:59 +13005010 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005011 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005012 }
5013
5014 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5015
5016 return result;
5017}
Chris Forbes9a083b92016-11-02 16:58:15 +13005018
5019VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5020 uint32_t queueFamilyIndex)
5021{
5022 VkBool32 result = false;
5023
Chris Forbes7b58a712016-11-24 11:35:31 +13005024 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005025 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005026 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005027
Chris Forbes04b61da2016-11-03 09:53:59 +13005028 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005029 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005030
Chris Forbes7281a502016-11-08 08:45:03 +13005031 // TODO: codegen doesn't produce this function?
5032 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005033
Chris Forbes04b61da2016-11-03 09:53:59 +13005034 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005035 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005036 }
5037
5038 return result;
5039}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005040#endif // VK_USE_PLATFORM_WIN32_KHR
5041
5042#ifdef VK_USE_PLATFORM_XCB_KHR
5043VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5044 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5045 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5046
Chris Forbes7b58a712016-11-24 11:35:31 +13005047 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005049 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005050
Chris Forbes04b61da2016-11-03 09:53:59 +13005051 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005052 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005053
Chris Forbes04b61da2016-11-03 09:53:59 +13005054 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005055
Chris Forbes04b61da2016-11-03 09:53:59 +13005056 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005057 result = my_data->dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005058 }
5059
5060 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5061
5062 return result;
5063}
5064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005065VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5066 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5067 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005068 VkBool32 result = false;
5069
Chris Forbes7b58a712016-11-24 11:35:31 +13005070 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005071 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005072 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005073
Chris Forbes04b61da2016-11-03 09:53:59 +13005074 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005075 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005076
Chris Forbes04b61da2016-11-03 09:53:59 +13005077 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005078 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005079
Chris Forbes04b61da2016-11-03 09:53:59 +13005080 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005081 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5082 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005083 }
5084
5085 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005086}
5087#endif // VK_USE_PLATFORM_XCB_KHR
5088
5089#ifdef VK_USE_PLATFORM_XLIB_KHR
5090VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005091 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005092 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5093
Chris Forbes7b58a712016-11-24 11:35:31 +13005094 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005095 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005096 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005097
Chris Forbes04b61da2016-11-03 09:53:59 +13005098 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005099 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005100
Chris Forbes04b61da2016-11-03 09:53:59 +13005101 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005102
Chris Forbes04b61da2016-11-03 09:53:59 +13005103 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005104 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005105 }
5106
5107 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5108
5109 return result;
5110}
5111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005112VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5113 uint32_t queueFamilyIndex, Display *dpy,
5114 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005115 VkBool32 result = false;
5116
Chris Forbes7b58a712016-11-24 11:35:31 +13005117 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005118 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005119 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005120
Chris Forbes04b61da2016-11-03 09:53:59 +13005121 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005122 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005123
Chris Forbes04b61da2016-11-03 09:53:59 +13005124 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005125
Chris Forbes04b61da2016-11-03 09:53:59 +13005126 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005127 result =
5128 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005129 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005130 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005131}
5132#endif // VK_USE_PLATFORM_XLIB_KHR
5133
5134#ifdef VK_USE_PLATFORM_MIR_KHR
5135VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005136 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005137 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5138
Chris Forbes7b58a712016-11-24 11:35:31 +13005139 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005140 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005141 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005142
Chris Forbes04b61da2016-11-03 09:53:59 +13005143 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005144 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005145
Chris Forbes04b61da2016-11-03 09:53:59 +13005146 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005147
Chris Forbes04b61da2016-11-03 09:53:59 +13005148 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005149 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005150 }
5151
5152 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5153
5154 return result;
5155}
5156
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005157VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5158 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005159 VkBool32 result = false;
5160
Chris Forbes7b58a712016-11-24 11:35:31 +13005161 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005162 assert(my_data != NULL);
5163
Chris Forbes04b61da2016-11-03 09:53:59 +13005164 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005165
Chris Forbes04b61da2016-11-03 09:53:59 +13005166 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005167 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5168
Chris Forbes04b61da2016-11-03 09:53:59 +13005169 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005170
Chris Forbes04b61da2016-11-03 09:53:59 +13005171 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005172 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005173 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005174 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005175}
5176#endif // VK_USE_PLATFORM_MIR_KHR
5177
5178#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5179VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005180 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005181 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5182
Chris Forbes7b58a712016-11-24 11:35:31 +13005183 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005184 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005185 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005186
Chris Forbes04b61da2016-11-03 09:53:59 +13005187 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005188 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5189
Chris Forbes04b61da2016-11-03 09:53:59 +13005190 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005191
Chris Forbes04b61da2016-11-03 09:53:59 +13005192 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005193 result = my_data->dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005194 }
5195
5196 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5197
5198 return result;
5199}
5200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005201VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5202 uint32_t queueFamilyIndex,
5203 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005204 VkBool32 result = false;
5205
Chris Forbes7b58a712016-11-24 11:35:31 +13005206 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005207 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005208 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005209
Chris Forbes04b61da2016-11-03 09:53:59 +13005210 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005211 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5212
Chris Forbes04b61da2016-11-03 09:53:59 +13005213 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005214 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005215
Chris Forbes04b61da2016-11-03 09:53:59 +13005216 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005217 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005218 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005219
5220 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005221}
5222#endif // VK_USE_PLATFORM_WAYLAND_KHR
5223
5224#ifdef VK_USE_PLATFORM_ANDROID_KHR
5225VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005226 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005227 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5228
Chris Forbes7b58a712016-11-24 11:35:31 +13005229 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005230 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005231 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005232
Chris Forbes04b61da2016-11-03 09:53:59 +13005233 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005234 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005235
Chris Forbes04b61da2016-11-03 09:53:59 +13005236 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005237
Chris Forbes04b61da2016-11-03 09:53:59 +13005238 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005239 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005240 }
5241
5242 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5243
5244 return result;
5245}
5246#endif // VK_USE_PLATFORM_ANDROID_KHR
5247
Mark Youngead9b932016-09-08 12:28:38 -06005248VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5249 const VkSwapchainCreateInfoKHR *pCreateInfos,
5250 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5251 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005252 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005253 auto my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005254 assert(my_data != NULL);
5255
Chris Forbes04b61da2016-11-03 09:53:59 +13005256 skip |= require_device_extension(my_data, &layer_data::display_swapchain_enabled, "vkCreateSharedSwapchainsKHR", VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005257
Chris Forbes04b61da2016-11-03 09:53:59 +13005258 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005259 pSwapchains);
5260
Chris Forbes04b61da2016-11-03 09:53:59 +13005261 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005262 result = my_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005263
5264 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5265 }
5266
5267 return result;
5268}
5269
Chris Forbes667a5212016-11-03 10:18:35 +13005270VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5271 VkDisplayPropertiesKHR *pProperties) {
5272 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5273 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005274 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005275 assert(my_data != NULL);
5276
5277 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5278 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5279
5280 // No parameter validation function for this call?
5281
5282 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005283 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005284
5285 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5286 }
5287
5288 return result;
5289}
5290
5291VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5292 VkDisplayPlanePropertiesKHR *pProperties) {
5293 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5294 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005295 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005296 assert(my_data != NULL);
5297
5298 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5299 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5300
5301 // No parameter validation function for this call?
5302
5303 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005304 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005305
5306 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5307 }
5308
5309 return result;
5310}
5311
5312VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5313 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5314 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5315 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005316 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005317 assert(my_data != NULL);
5318
5319 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5320 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5321
5322 // No parameter validation function for this call?
5323
5324 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005325 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005326
5327 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5328 }
5329
5330 return result;
5331}
5332
5333VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5334 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5335 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5336 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005337 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005338 assert(my_data != NULL);
5339
5340 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5341 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5342
5343 // No parameter validation function for this call?
5344
5345 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005346 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005347
5348 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5349 }
5350
5351 return result;
5352}
5353
5354VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5355 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5356 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5357 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5358 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005359 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005360 assert(my_data != NULL);
5361
5362 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5363 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5364
5365 // No parameter validation function for this call?
5366
5367 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005368 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005369
5370 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5371 }
5372
5373 return result;
5374}
5375
5376VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5377 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5378 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5379 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005380 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005381 assert(my_data != NULL);
5382
5383 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5384 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5385
5386 // No parameter validation function for this call?
5387
5388 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005389 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005390
5391 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5392 }
5393
5394 return result;
5395}
5396
5397VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5398 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5399 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5400 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005401 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005402 assert(my_data != NULL);
5403
5404 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5405 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5406
5407 // No parameter validation function for this call?
5408
5409 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005410 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005411
5412 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5413 }
5414
5415 return result;
5416}
5417
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005418// VK_EXT_debug_marker Extension
5419VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5420 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005421 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005422 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5423 assert(my_data != NULL);
5424
Chris Forbes04b61da2016-11-03 09:53:59 +13005425 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005426
Chris Forbes04b61da2016-11-03 09:53:59 +13005427 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005428 result = my_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005429
5430 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5431 }
5432
5433 return result;
5434}
5435
5436VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5437 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005438 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5440 assert(my_data != NULL);
5441
Chris Forbes04b61da2016-11-03 09:53:59 +13005442 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005443
Chris Forbes04b61da2016-11-03 09:53:59 +13005444 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005445 VkResult result = my_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005446
5447 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5448 }
5449
5450 return result;
5451}
5452
5453VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005454 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005455 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5456 assert(my_data != NULL);
5457
Chris Forbes04b61da2016-11-03 09:53:59 +13005458 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005459
Chris Forbes04b61da2016-11-03 09:53:59 +13005460 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005461 my_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005462 }
5463}
5464
5465VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005466 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5468 assert(my_data != NULL);
5469
Chris Forbes04b61da2016-11-03 09:53:59 +13005470 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005471
Chris Forbes04b61da2016-11-03 09:53:59 +13005472 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005473 my_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005474 }
5475}
5476
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005477// VK_NV_external_memory_capabilities Extension
5478VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5479 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5480 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5481 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5482
5483 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005484 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005485 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005486 assert(my_data != NULL);
5487
Chris Forbes04b61da2016-11-03 09:53:59 +13005488 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005489 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5490
Chris Forbes04b61da2016-11-03 09:53:59 +13005491 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005492 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
5493 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005494
5495 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5496 }
5497
5498 return result;
5499}
5500
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005501#ifdef VK_USE_PLATFORM_WIN32_KHR
5502// VK_NV_external_memory_win32 Extension
5503VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5504 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5505
5506 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005507 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005508 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5509 assert(my_data != NULL);
5510
Chris Forbes04b61da2016-11-03 09:53:59 +13005511 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005512
Chris Forbes04b61da2016-11-03 09:53:59 +13005513 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005514 result = my_data->dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005515 }
5516
5517 return result;
5518}
5519#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005520
5521
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005523static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005524
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005525static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005526
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005527static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005529static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005530
Chia-I Wu01ca2372016-05-13 14:37:49 +08005531VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005532 assert(device);
5533
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005534 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5535
Dustin Graves080069b2016-04-05 13:48:15 -06005536 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005537 return NULL;
5538 }
5539
Chia-I Wuf9b01382016-05-16 07:37:41 +08005540 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5541 if (proc)
5542 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005543
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005544 proc = InterceptWsiEnabledCommand(funcName, device);
5545 if (proc)
5546 return proc;
5547
Chris Forbese58c9fe2016-11-24 14:44:17 +13005548 if (!data->dispatch_table.GetDeviceProcAddr)
5549 return nullptr;
5550 return data->dispatch_table.GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005551}
5552
Chia-I Wu01ca2372016-05-13 14:37:49 +08005553VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005554 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005555 if (!proc)
5556 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005557
5558 if (!proc)
5559 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005560
Chia-I Wu617f2a42016-05-16 07:41:17 +08005561 if (proc)
5562 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005563
Chia-I Wu617f2a42016-05-16 07:41:17 +08005564 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005565
Chris Forbes7b58a712016-11-24 11:35:31 +13005566 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005567
Chia-I Wu617f2a42016-05-16 07:41:17 +08005568 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005569 if (!proc)
5570 proc = InterceptWsiEnabledCommand(funcName, instance);
5571
Chia-I Wu617f2a42016-05-16 07:41:17 +08005572 if (proc)
5573 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005574
Chris Forbes6444bba2016-11-24 14:15:23 +13005575 if (!data->dispatch_table.GetInstanceProcAddr)
5576 return nullptr;
5577 return data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005578}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005579
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005580static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005581 static const struct {
5582 const char *name;
5583 PFN_vkVoidFunction proc;
5584 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005585 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5586 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5587 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5588 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5589 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5590 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5591 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5592 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5593 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5594 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5595 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5596 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5597 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5598 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5599 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5600 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5601 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005602 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005603 };
5604
5605 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5606 if (!strcmp(core_instance_commands[i].name, name))
5607 return core_instance_commands[i].proc;
5608 }
5609
5610 return nullptr;
5611}
5612
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005613static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005614 static const struct {
5615 const char *name;
5616 PFN_vkVoidFunction proc;
5617 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005618 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5619 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5620 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5621 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5622 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5623 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5624 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5625 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5626 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5627 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5628 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5629 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5630 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5631 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5632 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5633 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5634 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5635 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5636 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5637 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5638 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5639 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5640 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5641 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5642 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5643 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5644 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5645 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5646 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5647 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5648 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5649 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5650 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5651 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5652 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5653 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5654 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5655 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5656 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5657 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5658 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5659 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5660 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5661 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5662 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5663 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5664 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5665 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5666 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5667 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5668 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5669 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5670 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5671 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5672 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5673 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5674 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5675 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5676 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5677 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5678 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5679 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5680 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5681 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5682 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5683 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5684 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5685 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5686 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5687 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5688 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5689 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5690 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5691 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5692 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5693 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5694 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5695 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5696 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5697 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5698 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5699 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5700 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5701 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5702 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5703 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5704 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5705 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5706 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5707 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5708 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5709 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5710 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5711 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5712 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5713 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5714 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5715 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5716 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5717 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5718 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5719 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5720 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5721 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5722 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5723 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5724 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5725 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5726 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5727 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5728 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5729 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5730 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5731 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5732 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5733 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5734 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005735 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5736 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5737 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5738 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005739#ifdef VK_USE_PLATFORM_WIN32_KHR
5740 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5741#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005742};
5743
Chia-I Wuf9b01382016-05-16 07:37:41 +08005744
5745 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5746 if (!strcmp(core_device_commands[i].name, name))
5747 return core_device_commands[i].proc;
5748 }
5749
5750 return nullptr;
5751}
5752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005753static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005754 static const struct {
5755 const char *name;
5756 PFN_vkVoidFunction proc;
5757 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005758 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5759 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5760 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5761 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005762 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005763 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005764 };
5765
5766 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005767 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5768 if (!strcmp(wsi_device_commands[i].name, name))
5769 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005770 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005771 }
5772
5773 return nullptr;
5774}
5775
5776static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5777 static const struct {
5778 const char *name;
5779 PFN_vkVoidFunction proc;
5780 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005781 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5782 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5783 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5784 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5785 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5786 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005787 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005788 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5789 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5790 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5791 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5792 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5793 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5794 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5795 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005796#ifdef VK_USE_PLATFORM_WIN32_KHR
5797 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5798 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5799#endif
5800#ifdef VK_USE_PLATFORM_XCB_KHR
5801 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5802 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5803#endif
5804#ifdef VK_USE_PLATFORM_XLIB_KHR
5805 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5806 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5807#endif
5808#ifdef VK_USE_PLATFORM_MIR_KHR
5809 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5810 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5811#endif
5812#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5813 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5814 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5815#endif
5816#ifdef VK_USE_PLATFORM_ANDROID_KHR
5817 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5818#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005819 };
5820
Chris Forbes8a13e272016-11-02 17:43:34 +13005821 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5822 if (!strcmp(wsi_instance_commands[i].name, name))
5823 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005824 }
5825
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005826 return nullptr;
5827}
5828
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005829} // namespace parameter_validation
5830
5831// vk_layer_logging.h expects these to be defined
5832
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005833VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5834 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5835 const VkAllocationCallbacks *pAllocator,
5836 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005837 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005838}
5839
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005840VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5841 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005842 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005843}
5844
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005845VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5846 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5847 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005848 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005849}
5850
5851// loader-layer interface v0
5852
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005853VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5854 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005855 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005856}
5857
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005858VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5859 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005860 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005861}
5862
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005863VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5864 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005865 // the layer command handles VK_NULL_HANDLE just fine internally
5866 assert(physicalDevice == VK_NULL_HANDLE);
5867 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005868}
5869
5870VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5871 const char *pLayerName, uint32_t *pCount,
5872 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005873 // the layer command handles VK_NULL_HANDLE just fine internally
5874 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005875 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005876}
5877
5878VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005879 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005880}
5881
5882VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005883 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005884}