blob: 078a0aa644b7293e3e1afc199ba60575298d881e [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;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003829 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3830
3831 if (pInfo != NULL) {
Chris Forbesc5554a52016-11-24 14:45:16 +13003832 if ((dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003833 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003834 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 -06003835 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003836 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3837 "inheritedQueries.");
3838 }
3839
Chris Forbesc5554a52016-11-24 14:45:16 +13003840 if ((dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003841 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003842 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003843 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003844 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003845 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3846 "valid combination of VkQueryControlFlagBits.",
3847 pInfo->queryFlags);
3848 }
3849 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003850 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003851}
3852
3853VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003854 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003855 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003856 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3857 assert(device_data != nullptr);
3858 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003859
Chris Forbes04b61da2016-11-03 09:53:59 +13003860 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003861
Dustin Gravesc900f572016-05-16 11:07:59 -06003862 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3863 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003864 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003865 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3866 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3867
3868 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003869 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003870 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003871
Chris Forbes04b61da2016-11-03 09:53:59 +13003872 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003873 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3874
Dustin Gravesc900f572016-05-16 11:07:59 -06003875 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003876 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003877 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3878
3879 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003880 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003881 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3882 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3883 }
3884
Chris Forbes04b61da2016-11-03 09:53:59 +13003885 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003886
Chris Forbes04b61da2016-11-03 09:53:59 +13003887 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003888 result = device_data->dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003889
Dustin Gravesc900f572016-05-16 11:07:59 -06003890 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003891 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003892
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003893 return result;
3894}
3895
Chia-I Wu01ca2372016-05-13 14:37:49 +08003896VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003897 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3898 assert(my_data != NULL);
3899
Chris Forbese58c9fe2016-11-24 14:44:17 +13003900 VkResult result = my_data->dispatch_table.EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003901
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003902 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003903
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003904 return result;
3905}
3906
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003907VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003908 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003909 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3910 assert(my_data != NULL);
3911
Chris Forbes04b61da2016-11-03 09:53:59 +13003912 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913
Chris Forbes04b61da2016-11-03 09:53:59 +13003914 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003915 result = my_data->dispatch_table.ResetCommandBuffer(commandBuffer, flags);
Dustin Graves16d18972016-05-09 17:36:57 -06003916
3917 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3918 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003920 return result;
3921}
3922
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003923VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3924 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003925 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003926 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3927 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003928
Chris Forbes04b61da2016-11-03 09:53:59 +13003929 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003930
Chris Forbes04b61da2016-11-03 09:53:59 +13003931 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003932 my_data->dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003933 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003934}
3935
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003936bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3937 debug_report_data *report_data = my_data->report_data;
3938
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003939 bool skip =
3940 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003941
3942 if (viewport_count > 0 && viewports != nullptr) {
3943 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3944 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3945 const VkViewport &viewport = viewports[viewportIndex];
3946
3947 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3948 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3949 VALIDATION_ERROR_01448, LayerName,
3950 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3951 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3952 }
3953
3954 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3955 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3956 // VALIDATION_ERROR_01790
3957 invalid_height = false;
3958 }
3959 if (invalid_height) {
3960 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3961 VALIDATION_ERROR_01449, LayerName,
3962 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3963 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3964 }
3965
3966 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3967 skip |=
3968 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3969 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3970 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3971 validation_error_map[VALIDATION_ERROR_01450]);
3972 }
3973
3974 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
3975 skip |=
3976 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3977 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
3978 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3979 validation_error_map[VALIDATION_ERROR_01450]);
3980 }
3981
3982 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
3983 skip |=
3984 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3985 VALIDATION_ERROR_01451, LayerName,
3986 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
3987 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
3988 }
3989
3990 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
3991 skip |=
3992 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3993 VALIDATION_ERROR_01452, LayerName,
3994 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
3995 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
3996 }
3997 }
3998 }
3999
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004000 return skip;
4001}
4002
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004003VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4004 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004005 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004006 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004007 assert(my_data != NULL);
4008
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004009 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004010
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004011 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004012 my_data->dispatch_table.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004013 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004014}
4015
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004016VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4017 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004018 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004019 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004020 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004021 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004022
Chris Forbes04b61da2016-11-03 09:53:59 +13004023 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004024
Mike Weiblena4742dc2016-10-31 11:05:56 -06004025 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4026 const VkRect2D &pScissor = pScissors[scissorIndex];
4027
4028 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004029 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 -06004030 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4031 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4032 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004033 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 -06004034 VALIDATION_ERROR_01490, LayerName,
4035 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4036 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4037 }
4038
4039 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004040 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 -06004041 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4042 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4043 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004044 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 -06004045 VALIDATION_ERROR_01491, LayerName,
4046 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4047 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4048 }
4049 }
4050
Chris Forbes04b61da2016-11-03 09:53:59 +13004051 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004052 my_data->dispatch_table.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004053 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004054}
4055
Chia-I Wu01ca2372016-05-13 14:37:49 +08004056VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004057 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4058 my_data->dispatch_table.CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004059}
4060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004061VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4062 float depthBiasSlopeFactor) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004063 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4064 my_data->dispatch_table.CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004065}
4066
Chia-I Wu01ca2372016-05-13 14:37:49 +08004067VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004068 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004069 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004070 assert(my_data != NULL);
4071
Chris Forbes04b61da2016-11-03 09:53:59 +13004072 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004073
Chris Forbes04b61da2016-11-03 09:53:59 +13004074 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004075 my_data->dispatch_table.CmdSetBlendConstants(commandBuffer, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004076 }
Cody Northrop12365112015-08-17 11:10:49 -06004077}
4078
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004079VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004080 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4081 my_data->dispatch_table.CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004082}
4083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004084VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4085 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004086 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004087 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4088 assert(my_data != NULL);
4089
Chris Forbes04b61da2016-11-03 09:53:59 +13004090 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004091
Chris Forbes04b61da2016-11-03 09:53:59 +13004092 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004093 my_data->dispatch_table.CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004094 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004095}
4096
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004097VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004098 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4100 assert(my_data != NULL);
4101
Chris Forbes04b61da2016-11-03 09:53:59 +13004102 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004103
Chris Forbes04b61da2016-11-03 09:53:59 +13004104 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004105 my_data->dispatch_table.CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004106 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004107}
4108
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004109VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004110 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004111 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4112 assert(my_data != NULL);
4113
Chris Forbes04b61da2016-11-03 09:53:59 +13004114 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004115
Chris Forbes04b61da2016-11-03 09:53:59 +13004116 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004117 my_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004118 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004119}
4120
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004121VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4122 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4123 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4124 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004125 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004126 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004127 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004128
Chris Forbes04b61da2016-11-03 09:53:59 +13004129 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004130 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4131 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004132
Chris Forbes04b61da2016-11-03 09:53:59 +13004133 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004134 my_data->dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004135 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004136 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004137}
4138
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004139VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4140 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004141 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004142 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4143 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004144
Chris Forbes04b61da2016-11-03 09:53:59 +13004145 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004146
Chris Forbes04b61da2016-11-03 09:53:59 +13004147 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004148 my_data->dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004149 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004150}
4151
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004152VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4153 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004154 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004155 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004156 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004157
Chris Forbes04b61da2016-11-03 09:53:59 +13004158 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004159
Chris Forbes04b61da2016-11-03 09:53:59 +13004160 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004161 my_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004162 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004163}
4164
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004165bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4166 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004167 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004168 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004169 // 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 -07004170 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004171 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 -06004172 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004173 return false;
4174 }
4175
4176 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004177 // 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 -07004178 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004179 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 -06004180 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004181 return false;
4182 }
4183
4184 return true;
4185}
4186
Chia-I Wu01ca2372016-05-13 14:37:49 +08004187VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4188 uint32_t firstVertex, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004189 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004190 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004191
Chris Forbese58c9fe2016-11-24 14:44:17 +13004192 my_data->dispatch_table.CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004193}
4194
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004195VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4196 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004197 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4198 my_data->dispatch_table.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004199}
4200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004201VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4202 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004203 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004204 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4205 assert(my_data != NULL);
4206
Chris Forbes04b61da2016-11-03 09:53:59 +13004207 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004208
Chris Forbes04b61da2016-11-03 09:53:59 +13004209 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004210 my_data->dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004211 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004212}
4213
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004214VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4215 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004216 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004217 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4218 assert(my_data != NULL);
4219
Chris Forbes04b61da2016-11-03 09:53:59 +13004220 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004221
Chris Forbes04b61da2016-11-03 09:53:59 +13004222 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004223 my_data->dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004224 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004225}
4226
Chia-I Wu01ca2372016-05-13 14:37:49 +08004227VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004228 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4229 my_data->dispatch_table.CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004230}
4231
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004232VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004233 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004234 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4235 assert(my_data != NULL);
4236
Chris Forbes04b61da2016-11-03 09:53:59 +13004237 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004238
Chris Forbes04b61da2016-11-03 09:53:59 +13004239 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004240 my_data->dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004241 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004242}
4243
Chia-I Wu01ca2372016-05-13 14:37:49 +08004244VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4245 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004246 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004247 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004248 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004249
Chris Forbes04b61da2016-11-03 09:53:59 +13004250 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004251
Chris Forbes04b61da2016-11-03 09:53:59 +13004252 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004253 my_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004254 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004255}
4256
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004257bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004258 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004259 if (pRegions != nullptr) {
4260 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4261 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004262 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 -06004263 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004264 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4265 return false;
4266 }
4267 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4268 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004269 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 -06004270 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004271 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4272 return false;
4273 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004274 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004275
4276 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004277}
4278
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004279VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4280 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4281 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004282 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004283 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004284 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004285
Chris Forbes04b61da2016-11-03 09:53:59 +13004286 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004287 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004288
Chris Forbes04b61da2016-11-03 09:53:59 +13004289 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004290 PreCmdCopyImage(commandBuffer, pRegions);
4291
Chris Forbese58c9fe2016-11-24 14:44:17 +13004292 my_data->dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004293 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004294}
4295
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004296bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004297 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004298 if (pRegions != nullptr) {
4299 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4300 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004301 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 -06004302 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004303 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4304 return false;
4305 }
4306 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4307 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004308 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 -06004309 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004310 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4311 return false;
4312 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004313 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004314
4315 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004316}
4317
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004318VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4319 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4320 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004321 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004322 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004323 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004324
Chris Forbes04b61da2016-11-03 09:53:59 +13004325 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004326 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004327
Chris Forbes04b61da2016-11-03 09:53:59 +13004328 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004329 PreCmdBlitImage(commandBuffer, pRegions);
4330
Chris Forbese58c9fe2016-11-24 14:44:17 +13004331 my_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004332 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004333}
4334
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004335bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004336 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004337 if (pRegions != nullptr) {
4338 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4339 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004340 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 -06004341 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004342 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4343 "enumerator");
4344 return false;
4345 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004346 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004347
4348 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004349}
4350
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004351VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4352 VkImageLayout dstImageLayout, uint32_t regionCount,
4353 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004354 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004355 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004356 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004357
Chris Forbes04b61da2016-11-03 09:53:59 +13004358 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004359 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004360
Chris Forbes04b61da2016-11-03 09:53:59 +13004361 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004362 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4363
Chris Forbese58c9fe2016-11-24 14:44:17 +13004364 my_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004365 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004366}
4367
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004368bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004369 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004370 if (pRegions != nullptr) {
4371 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4372 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004373 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 -06004374 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004375 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4376 "enumerator");
4377 return false;
4378 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004379 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004380
4381 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004382}
4383
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004384VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4385 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004386 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004387 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004388 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004389
Chris Forbes04b61da2016-11-03 09:53:59 +13004390 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004391 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004392
Chris Forbes04b61da2016-11-03 09:53:59 +13004393 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004394 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4395
Chris Forbese58c9fe2016-11-24 14:44:17 +13004396 my_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004397 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004398}
4399
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004400VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4401 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004402 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004403 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004404 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004405
Chris Forbes04b61da2016-11-03 09:53:59 +13004406 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004407
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004408 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004409 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004410 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4411 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004412 }
4413
4414 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004415 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004416 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4417 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004418 dataSize);
4419 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004420 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004421 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4422 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004423 }
4424
Chris Forbes04b61da2016-11-03 09:53:59 +13004425 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004426 my_data->dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004427 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004428}
4429
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004430VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4431 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004432 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004433 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4434 assert(my_data != NULL);
4435
Chris Forbes04b61da2016-11-03 09:53:59 +13004436 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004437
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004438 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004439 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004440 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4441 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004442 }
4443
4444 if (size != VK_WHOLE_SIZE) {
4445 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004446 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004447 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004448 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004449 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004450 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004451 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004452 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4453 }
4454 }
4455
Chris Forbes04b61da2016-11-03 09:53:59 +13004456 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004457 my_data->dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004458 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004459}
4460
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004461VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4462 const VkClearColorValue *pColor, uint32_t rangeCount,
4463 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004464 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004465 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004466 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004467
Chris Forbes04b61da2016-11-03 09:53:59 +13004468 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004469
Chris Forbes04b61da2016-11-03 09:53:59 +13004470 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004471 my_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004472 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004473}
4474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004475VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4476 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4477 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004478 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004479 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004480 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004481
Chris Forbes04b61da2016-11-03 09:53:59 +13004482 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004483 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004484
Chris Forbes04b61da2016-11-03 09:53:59 +13004485 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004486 my_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004487 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004488}
4489
Chia-I Wu01ca2372016-05-13 14:37:49 +08004490VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4491 const VkClearAttachment *pAttachments, uint32_t rectCount,
4492 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004493 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004494 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004495 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004496
Chris Forbes04b61da2016-11-03 09:53:59 +13004497 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004498
Chris Forbes04b61da2016-11-03 09:53:59 +13004499 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004500 my_data->dispatch_table.CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004501 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004502}
4503
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004504bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004505 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004506 if (pRegions != nullptr) {
4507 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4508 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4509 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004510 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 -06004511 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004512 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4513 return false;
4514 }
4515 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4516 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4517 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004518 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 -06004519 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004520 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4521 return false;
4522 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004523 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004524
4525 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004526}
4527
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004528VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4529 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4530 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004531 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004532 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004533 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004534
Chris Forbes04b61da2016-11-03 09:53:59 +13004535 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004536 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004537
Chris Forbes04b61da2016-11-03 09:53:59 +13004538 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004539 PreCmdResolveImage(commandBuffer, pRegions);
4540
Chris Forbese58c9fe2016-11-24 14:44:17 +13004541 my_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004542 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004543}
4544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004545VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004546 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004547 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4548 assert(my_data != NULL);
4549
Chris Forbes04b61da2016-11-03 09:53:59 +13004550 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004551
Chris Forbes04b61da2016-11-03 09:53:59 +13004552 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004553 my_data->dispatch_table.CmdSetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004554 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004555}
4556
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004557VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004558 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004559 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4560 assert(my_data != NULL);
4561
Chris Forbes04b61da2016-11-03 09:53:59 +13004562 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004563
Chris Forbes04b61da2016-11-03 09:53:59 +13004564 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004565 my_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004566 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004567}
4568
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004569VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4570 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4571 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4572 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4573 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004574 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004575 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004576 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004577
Chris Forbes04b61da2016-11-03 09:53:59 +13004578 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004579 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4580 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004581
Chris Forbes04b61da2016-11-03 09:53:59 +13004582 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004583 my_data->dispatch_table.CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004584 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004585 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004586}
4587
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004588VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4589 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4590 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4591 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4592 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004593 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004594 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004595 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004596
Chris Forbes04b61da2016-11-03 09:53:59 +13004597 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004598 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4599 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004600
Chris Forbes04b61da2016-11-03 09:53:59 +13004601 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004602 my_data->dispatch_table.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004603 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004604 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004605}
4606
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004607VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4608 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004609 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004610 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4611 assert(my_data != NULL);
4612
Chris Forbes04b61da2016-11-03 09:53:59 +13004613 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004614
Chris Forbes04b61da2016-11-03 09:53:59 +13004615 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004616 my_data->dispatch_table.CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004617 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004618}
4619
Chia-I Wu01ca2372016-05-13 14:37:49 +08004620VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004621 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004622 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4623 assert(my_data != NULL);
4624
Chris Forbes04b61da2016-11-03 09:53:59 +13004625 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004626
Chris Forbes04b61da2016-11-03 09:53:59 +13004627 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004628 my_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004629 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004630}
4631
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004632VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4633 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004634 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004635 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4636 assert(my_data != NULL);
4637
Chris Forbes04b61da2016-11-03 09:53:59 +13004638 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004639
Chris Forbes04b61da2016-11-03 09:53:59 +13004640 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004641 my_data->dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004642 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004643}
4644
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004645bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4646 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004647
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004648 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004649
4650 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004651}
4652
Chia-I Wu01ca2372016-05-13 14:37:49 +08004653VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4654 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004655 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004656 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4657 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004658
Chris Forbes04b61da2016-11-03 09:53:59 +13004659 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004660
Chris Forbes04b61da2016-11-03 09:53:59 +13004661 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004662 my_data->dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004663
4664 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4665 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004666}
4667
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004668VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4669 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4670 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004671 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004672 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4673 assert(my_data != NULL);
4674
Chris Forbes04b61da2016-11-03 09:53:59 +13004675 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004676 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004677
Chris Forbes04b61da2016-11-03 09:53:59 +13004678 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004679 my_data->dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004680 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004681}
4682
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004683VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4684 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004685 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004687 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004688
Chris Forbes04b61da2016-11-03 09:53:59 +13004689 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004690
Chris Forbes04b61da2016-11-03 09:53:59 +13004691 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004692 my_data->dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004693 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004694}
4695
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004696VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4697 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004698 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004699 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004700 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004701
Chris Forbes04b61da2016-11-03 09:53:59 +13004702 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004703
Chris Forbes04b61da2016-11-03 09:53:59 +13004704 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004705 my_data->dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004706 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004707}
4708
Chia-I Wu01ca2372016-05-13 14:37:49 +08004709VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004710 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004711 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4712 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004713
Chris Forbes04b61da2016-11-03 09:53:59 +13004714 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004715
Chris Forbes04b61da2016-11-03 09:53:59 +13004716 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004717 my_data->dispatch_table.CmdNextSubpass(commandBuffer, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004718 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004719}
4720
Chia-I Wu01ca2372016-05-13 14:37:49 +08004721VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004722 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4723 my_data->dispatch_table.CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004724}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004726VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4727 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004728 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004729 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004730 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004731
Chris Forbes04b61da2016-11-03 09:53:59 +13004732 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004733
Chris Forbes04b61da2016-11-03 09:53:59 +13004734 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004735 my_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004736 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004737}
4738
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004739VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004740 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4741}
4742
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004743VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4744 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004745 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4746}
4747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004748VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4749 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004750 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4751 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4752
4753 return VK_ERROR_LAYER_NOT_PRESENT;
4754}
4755
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004756VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4757 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004758 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004759 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004760 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004761
4762 assert(physicalDevice);
4763
Chris Forbes6444bba2016-11-24 14:15:23 +13004764 return get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map)
4765 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004766}
4767
Chris Forbes448ebcb2016-11-03 09:29:52 +13004768bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4769{
4770 if (!(my_data->*flag)) {
4771 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4772 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4773 "%s() called even though the %s extension was not enabled for this VkDevice.",
4774 function_name, extension_name);
4775 }
4776
4777 return false;
4778}
4779
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004780// WSI Extension Functions
4781
4782VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004783 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004784 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004785 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4787 assert(my_data != NULL);
4788
Chris Forbes04b61da2016-11-03 09:53:59 +13004789 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004790
Chris Forbes04b61da2016-11-03 09:53:59 +13004791 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004792
Chris Forbes04b61da2016-11-03 09:53:59 +13004793 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004794 result = my_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004795
4796 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4797 }
4798
4799 return result;
4800}
4801
4802VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004803 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004805 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004806 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4807 assert(my_data != NULL);
4808
Chris Forbes04b61da2016-11-03 09:53:59 +13004809 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004810
Chris Forbes04b61da2016-11-03 09:53:59 +13004811 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004812 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4813
Chris Forbes04b61da2016-11-03 09:53:59 +13004814 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004815 result = my_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004816
4817 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4818 }
4819
4820 return result;
4821}
4822
4823VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004824 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004825 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004826 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4828 assert(my_data != NULL);
4829
Chris Forbes04b61da2016-11-03 09:53:59 +13004830 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004831
Chris Forbes04b61da2016-11-03 09:53:59 +13004832 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004833 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4834
Chris Forbes04b61da2016-11-03 09:53:59 +13004835 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004836 result = my_data->dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004837
4838 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4839 }
4840
4841 return result;
4842}
4843
4844VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4845 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004846 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004847 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4848 assert(my_data != NULL);
4849
Chris Forbes04b61da2016-11-03 09:53:59 +13004850 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004851
Chris Forbes04b61da2016-11-03 09:53:59 +13004852 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004853
Chris Forbes04b61da2016-11-03 09:53:59 +13004854 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004855 result = my_data->dispatch_table.QueuePresentKHR(queue, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004856
4857 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4858 }
4859
4860 return result;
4861}
4862
Chris Forbesbe5f5202016-11-02 18:34:25 +13004863VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004864 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004865 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4866 assert(my_data != NULL);
4867
Chris Forbes04b61da2016-11-03 09:53:59 +13004868 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004869
4870 /* No generated validation function for this call */
4871
Chris Forbes04b61da2016-11-03 09:53:59 +13004872 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004873 my_data->dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004874 }
4875}
4876
Chris Forbes115f98c2016-11-03 09:51:48 +13004877bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4878{
Chris Forbes6be763e2016-11-24 12:42:33 +13004879 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
4880 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13004881 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4882 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4883 "%s() called even though the %s extension was not enabled for this VkInstance.",
4884 function_name, extension_name);
4885 }
4886
4887 return false;
4888}
4889
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004890VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4891 VkSurfaceKHR surface, VkBool32 *pSupported) {
4892 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004893 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004894 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004895 assert(my_data != NULL);
4896
Chris Forbes04b61da2016-11-03 09:53:59 +13004897 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004898 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004899
Chris Forbes04b61da2016-11-03 09:53:59 +13004900 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004901 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4902
Chris Forbes04b61da2016-11-03 09:53:59 +13004903 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004904 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004905
4906 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4907 }
4908
4909 return result;
4910}
4911
4912VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4913 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4914 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004915 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004916 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004917 assert(my_data != NULL);
4918
Chris Forbes04b61da2016-11-03 09:53:59 +13004919 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004920 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004921
Chris Forbes04b61da2016-11-03 09:53:59 +13004922 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004923 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004924
Chris Forbes04b61da2016-11-03 09:53:59 +13004925 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004926 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004927
4928 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4929 }
4930
4931 return result;
4932}
4933
4934VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4935 uint32_t *pSurfaceFormatCount,
4936 VkSurfaceFormatKHR *pSurfaceFormats) {
4937 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004938 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004939 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004940 assert(my_data != NULL);
4941
Chris Forbes04b61da2016-11-03 09:53:59 +13004942 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004943 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004944
Chris Forbes04b61da2016-11-03 09:53:59 +13004945 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004946 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004947
Chris Forbes04b61da2016-11-03 09:53:59 +13004948 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004949 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
4950 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004951
4952 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4953 }
4954
4955 return result;
4956}
4957
4958VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4959 uint32_t *pPresentModeCount,
4960 VkPresentModeKHR *pPresentModes) {
4961 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004962 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004963 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004964 assert(my_data != NULL);
4965
Chris Forbes04b61da2016-11-03 09:53:59 +13004966 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004967 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004968
Chris Forbes04b61da2016-11-03 09:53:59 +13004969 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004970 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004971
Chris Forbes04b61da2016-11-03 09:53:59 +13004972 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004973 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
4974 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004975
4976 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4977 }
4978
4979 return result;
4980}
4981
Chris Forbesbe5f5202016-11-02 18:34:25 +13004982VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004983 bool skip = false;
Chris Forbes6444bba2016-11-24 14:15:23 +13004984 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004985
Chris Forbes04b61da2016-11-03 09:53:59 +13004986 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004987 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004988
Chris Forbes04b61da2016-11-03 09:53:59 +13004989 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004990 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004991 }
4992}
4993
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004994#ifdef VK_USE_PLATFORM_WIN32_KHR
4995VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4996 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4997 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4998
Chris Forbes7b58a712016-11-24 11:35:31 +13004999 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005000 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005001 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005002
Chris Forbes04b61da2016-11-03 09:53:59 +13005003 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005004 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005005
Chris Forbes04b61da2016-11-03 09:53:59 +13005006 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005007
Chris Forbes04b61da2016-11-03 09:53:59 +13005008 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005009 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005010 }
5011
5012 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5013
5014 return result;
5015}
Chris Forbes9a083b92016-11-02 16:58:15 +13005016
5017VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5018 uint32_t queueFamilyIndex)
5019{
5020 VkBool32 result = false;
5021
Chris Forbes7b58a712016-11-24 11:35:31 +13005022 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005023 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005024 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005025
Chris Forbes04b61da2016-11-03 09:53:59 +13005026 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005027 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005028
Chris Forbes7281a502016-11-08 08:45:03 +13005029 // TODO: codegen doesn't produce this function?
5030 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005031
Chris Forbes04b61da2016-11-03 09:53:59 +13005032 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005033 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005034 }
5035
5036 return result;
5037}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005038#endif // VK_USE_PLATFORM_WIN32_KHR
5039
5040#ifdef VK_USE_PLATFORM_XCB_KHR
5041VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5042 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5043 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5044
Chris Forbes7b58a712016-11-24 11:35:31 +13005045 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005046 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005047 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048
Chris Forbes04b61da2016-11-03 09:53:59 +13005049 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005050 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005051
Chris Forbes04b61da2016-11-03 09:53:59 +13005052 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005053
Chris Forbes04b61da2016-11-03 09:53:59 +13005054 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005055 result = my_data->dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005056 }
5057
5058 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5059
5060 return result;
5061}
5062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005063VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5064 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5065 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005066 VkBool32 result = false;
5067
Chris Forbes7b58a712016-11-24 11:35:31 +13005068 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005069 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005070 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005071
Chris Forbes04b61da2016-11-03 09:53:59 +13005072 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005073 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005074
Chris Forbes04b61da2016-11-03 09:53:59 +13005075 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005076 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005077
Chris Forbes04b61da2016-11-03 09:53:59 +13005078 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005079 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5080 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005081 }
5082
5083 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005084}
5085#endif // VK_USE_PLATFORM_XCB_KHR
5086
5087#ifdef VK_USE_PLATFORM_XLIB_KHR
5088VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005089 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005090 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5091
Chris Forbes7b58a712016-11-24 11:35:31 +13005092 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005093 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005094 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005095
Chris Forbes04b61da2016-11-03 09:53:59 +13005096 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005097 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005098
Chris Forbes04b61da2016-11-03 09:53:59 +13005099 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005100
Chris Forbes04b61da2016-11-03 09:53:59 +13005101 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005102 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005103 }
5104
5105 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5106
5107 return result;
5108}
5109
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005110VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5111 uint32_t queueFamilyIndex, Display *dpy,
5112 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005113 VkBool32 result = false;
5114
Chris Forbes7b58a712016-11-24 11:35:31 +13005115 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005116 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005117 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005118
Chris Forbes04b61da2016-11-03 09:53:59 +13005119 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005120 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005121
Chris Forbes04b61da2016-11-03 09:53:59 +13005122 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005123
Chris Forbes04b61da2016-11-03 09:53:59 +13005124 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005125 result =
5126 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005127 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005128 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005129}
5130#endif // VK_USE_PLATFORM_XLIB_KHR
5131
5132#ifdef VK_USE_PLATFORM_MIR_KHR
5133VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005134 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005135 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5136
Chris Forbes7b58a712016-11-24 11:35:31 +13005137 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005138 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005139 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005140
Chris Forbes04b61da2016-11-03 09:53:59 +13005141 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005142 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005143
Chris Forbes04b61da2016-11-03 09:53:59 +13005144 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005145
Chris Forbes04b61da2016-11-03 09:53:59 +13005146 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005147 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005148 }
5149
5150 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5151
5152 return result;
5153}
5154
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005155VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5156 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005157 VkBool32 result = false;
5158
Chris Forbes7b58a712016-11-24 11:35:31 +13005159 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005160 assert(my_data != NULL);
5161
Chris Forbes04b61da2016-11-03 09:53:59 +13005162 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005163
Chris Forbes04b61da2016-11-03 09:53:59 +13005164 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005165 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5166
Chris Forbes04b61da2016-11-03 09:53:59 +13005167 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005168
Chris Forbes04b61da2016-11-03 09:53:59 +13005169 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005170 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005171 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005172 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005173}
5174#endif // VK_USE_PLATFORM_MIR_KHR
5175
5176#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5177VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005178 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005179 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5180
Chris Forbes7b58a712016-11-24 11:35:31 +13005181 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005182 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005183 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005184
Chris Forbes04b61da2016-11-03 09:53:59 +13005185 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005186 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5187
Chris Forbes04b61da2016-11-03 09:53:59 +13005188 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005189
Chris Forbes04b61da2016-11-03 09:53:59 +13005190 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005191 result = my_data->dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005192 }
5193
5194 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5195
5196 return result;
5197}
5198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005199VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5200 uint32_t queueFamilyIndex,
5201 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005202 VkBool32 result = false;
5203
Chris Forbes7b58a712016-11-24 11:35:31 +13005204 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005205 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005206 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005207
Chris Forbes04b61da2016-11-03 09:53:59 +13005208 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005209 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5210
Chris Forbes04b61da2016-11-03 09:53:59 +13005211 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005212 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005213
Chris Forbes04b61da2016-11-03 09:53:59 +13005214 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005215 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005216 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005217
5218 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005219}
5220#endif // VK_USE_PLATFORM_WAYLAND_KHR
5221
5222#ifdef VK_USE_PLATFORM_ANDROID_KHR
5223VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005224 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005225 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5226
Chris Forbes7b58a712016-11-24 11:35:31 +13005227 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005228 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005229 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005230
Chris Forbes04b61da2016-11-03 09:53:59 +13005231 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005232 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005233
Chris Forbes04b61da2016-11-03 09:53:59 +13005234 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005235
Chris Forbes04b61da2016-11-03 09:53:59 +13005236 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005237 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005238 }
5239
5240 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5241
5242 return result;
5243}
5244#endif // VK_USE_PLATFORM_ANDROID_KHR
5245
Mark Youngead9b932016-09-08 12:28:38 -06005246VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5247 const VkSwapchainCreateInfoKHR *pCreateInfos,
5248 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5249 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005250 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005251 auto my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005252 assert(my_data != NULL);
5253
Chris Forbes04b61da2016-11-03 09:53:59 +13005254 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 +13005255
Chris Forbes04b61da2016-11-03 09:53:59 +13005256 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005257 pSwapchains);
5258
Chris Forbes04b61da2016-11-03 09:53:59 +13005259 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005260 result = my_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005261
5262 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5263 }
5264
5265 return result;
5266}
5267
Chris Forbes667a5212016-11-03 10:18:35 +13005268VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5269 VkDisplayPropertiesKHR *pProperties) {
5270 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5271 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005272 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005273 assert(my_data != NULL);
5274
5275 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5276 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5277
5278 // No parameter validation function for this call?
5279
5280 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005281 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005282
5283 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5284 }
5285
5286 return result;
5287}
5288
5289VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5290 VkDisplayPlanePropertiesKHR *pProperties) {
5291 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5292 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005293 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005294 assert(my_data != NULL);
5295
5296 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5297 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5298
5299 // No parameter validation function for this call?
5300
5301 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005302 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005303
5304 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5305 }
5306
5307 return result;
5308}
5309
5310VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5311 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5312 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5313 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005314 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005315 assert(my_data != NULL);
5316
5317 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5318 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5319
5320 // No parameter validation function for this call?
5321
5322 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005323 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005324
5325 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5326 }
5327
5328 return result;
5329}
5330
5331VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5332 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5333 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5334 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005335 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005336 assert(my_data != NULL);
5337
5338 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5339 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5340
5341 // No parameter validation function for this call?
5342
5343 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005344 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005345
5346 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5347 }
5348
5349 return result;
5350}
5351
5352VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5353 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5354 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5355 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5356 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005357 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005358 assert(my_data != NULL);
5359
5360 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5361 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5362
5363 // No parameter validation function for this call?
5364
5365 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005366 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005367
5368 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5369 }
5370
5371 return result;
5372}
5373
5374VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5375 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5376 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5377 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005378 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005379 assert(my_data != NULL);
5380
5381 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5382 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5383
5384 // No parameter validation function for this call?
5385
5386 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005387 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005388
5389 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5390 }
5391
5392 return result;
5393}
5394
5395VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5396 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5397 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5398 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005399 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005400 assert(my_data != NULL);
5401
5402 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5403 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5404
5405 // No parameter validation function for this call?
5406
5407 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005408 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005409
5410 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5411 }
5412
5413 return result;
5414}
5415
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005416// VK_EXT_debug_marker Extension
5417VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5418 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005419 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5421 assert(my_data != NULL);
5422
Chris Forbes04b61da2016-11-03 09:53:59 +13005423 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005424
Chris Forbes04b61da2016-11-03 09:53:59 +13005425 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005426 result = my_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005427
5428 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5429 }
5430
5431 return result;
5432}
5433
5434VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5435 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005436 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005437 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5438 assert(my_data != NULL);
5439
Chris Forbes04b61da2016-11-03 09:53:59 +13005440 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005441
Chris Forbes04b61da2016-11-03 09:53:59 +13005442 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005443 VkResult result = my_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005444
5445 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5446 }
5447
5448 return result;
5449}
5450
5451VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005452 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005453 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5454 assert(my_data != NULL);
5455
Chris Forbes04b61da2016-11-03 09:53:59 +13005456 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005457
Chris Forbes04b61da2016-11-03 09:53:59 +13005458 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005459 my_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005460 }
5461}
5462
5463VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005464 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005465 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5466 assert(my_data != NULL);
5467
Chris Forbes04b61da2016-11-03 09:53:59 +13005468 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005469
Chris Forbes04b61da2016-11-03 09:53:59 +13005470 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005471 my_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005472 }
5473}
5474
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005475// VK_NV_external_memory_capabilities Extension
5476VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5477 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5478 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5479 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5480
5481 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005482 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005483 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005484 assert(my_data != NULL);
5485
Chris Forbes04b61da2016-11-03 09:53:59 +13005486 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005487 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5488
Chris Forbes04b61da2016-11-03 09:53:59 +13005489 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005490 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
5491 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005492
5493 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5494 }
5495
5496 return result;
5497}
5498
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005499#ifdef VK_USE_PLATFORM_WIN32_KHR
5500// VK_NV_external_memory_win32 Extension
5501VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5502 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5503
5504 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005505 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005506 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5507 assert(my_data != NULL);
5508
Chris Forbes04b61da2016-11-03 09:53:59 +13005509 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005510
Chris Forbes04b61da2016-11-03 09:53:59 +13005511 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005512 result = my_data->dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005513 }
5514
5515 return result;
5516}
5517#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005518
5519
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005520
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005521static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005523static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005524
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005525static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005526
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005527static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005528
Chia-I Wu01ca2372016-05-13 14:37:49 +08005529VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005530 assert(device);
5531
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005532 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5533
Dustin Graves080069b2016-04-05 13:48:15 -06005534 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005535 return NULL;
5536 }
5537
Chia-I Wuf9b01382016-05-16 07:37:41 +08005538 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5539 if (proc)
5540 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005541
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005542 proc = InterceptWsiEnabledCommand(funcName, device);
5543 if (proc)
5544 return proc;
5545
Chris Forbese58c9fe2016-11-24 14:44:17 +13005546 if (!data->dispatch_table.GetDeviceProcAddr)
5547 return nullptr;
5548 return data->dispatch_table.GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005549}
5550
Chia-I Wu01ca2372016-05-13 14:37:49 +08005551VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005552 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005553 if (!proc)
5554 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005555
5556 if (!proc)
5557 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005558
Chia-I Wu617f2a42016-05-16 07:41:17 +08005559 if (proc)
5560 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005561
Chia-I Wu617f2a42016-05-16 07:41:17 +08005562 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005563
Chris Forbes7b58a712016-11-24 11:35:31 +13005564 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005565
Chia-I Wu617f2a42016-05-16 07:41:17 +08005566 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005567 if (!proc)
5568 proc = InterceptWsiEnabledCommand(funcName, instance);
5569
Chia-I Wu617f2a42016-05-16 07:41:17 +08005570 if (proc)
5571 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005572
Chris Forbes6444bba2016-11-24 14:15:23 +13005573 if (!data->dispatch_table.GetInstanceProcAddr)
5574 return nullptr;
5575 return data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005576}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005577
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005578static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005579 static const struct {
5580 const char *name;
5581 PFN_vkVoidFunction proc;
5582 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005583 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5584 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5585 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5586 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5587 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5588 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5589 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5590 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5591 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5592 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5593 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5594 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5595 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5596 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5597 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5598 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5599 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005600 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005601 };
5602
5603 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5604 if (!strcmp(core_instance_commands[i].name, name))
5605 return core_instance_commands[i].proc;
5606 }
5607
5608 return nullptr;
5609}
5610
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005611static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005612 static const struct {
5613 const char *name;
5614 PFN_vkVoidFunction proc;
5615 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005616 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5617 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5618 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5619 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5620 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5621 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5622 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5623 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5624 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5625 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5626 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5627 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5628 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5629 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5630 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5631 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5632 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5633 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5634 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5635 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5636 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5637 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5638 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5639 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5640 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5641 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5642 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5643 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5644 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5645 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5646 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5647 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5648 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5649 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5650 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5651 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5652 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5653 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5654 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5655 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5656 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5657 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5658 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5659 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5660 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5661 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5662 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5663 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5664 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5665 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5666 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5667 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5668 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5669 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5670 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5671 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5672 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5673 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5674 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5675 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5676 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5677 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5678 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5679 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5680 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5681 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5682 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5683 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5684 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5685 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5686 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5687 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5688 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5689 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5690 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5691 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5692 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5693 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5694 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5695 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5696 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5697 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5698 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5699 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5700 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5701 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5702 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5703 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5704 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5705 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5706 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5707 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5708 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5709 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5710 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5711 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5712 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5713 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5714 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5715 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5716 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5717 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5718 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5719 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5720 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5721 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5722 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5723 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5724 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5725 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5726 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5727 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5728 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5729 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5730 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5731 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5732 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005733 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5734 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5735 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5736 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005737#ifdef VK_USE_PLATFORM_WIN32_KHR
5738 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5739#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005740};
5741
Chia-I Wuf9b01382016-05-16 07:37:41 +08005742
5743 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5744 if (!strcmp(core_device_commands[i].name, name))
5745 return core_device_commands[i].proc;
5746 }
5747
5748 return nullptr;
5749}
5750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005751static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005752 static const struct {
5753 const char *name;
5754 PFN_vkVoidFunction proc;
5755 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005756 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5757 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5758 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5759 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005760 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005761 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005762 };
5763
5764 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005765 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5766 if (!strcmp(wsi_device_commands[i].name, name))
5767 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005768 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005769 }
5770
5771 return nullptr;
5772}
5773
5774static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5775 static const struct {
5776 const char *name;
5777 PFN_vkVoidFunction proc;
5778 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005779 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5780 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5781 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5782 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5783 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5784 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005785 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005786 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5787 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5788 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5789 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5790 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5791 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5792 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5793 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005794#ifdef VK_USE_PLATFORM_WIN32_KHR
5795 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5796 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5797#endif
5798#ifdef VK_USE_PLATFORM_XCB_KHR
5799 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5800 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5801#endif
5802#ifdef VK_USE_PLATFORM_XLIB_KHR
5803 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5804 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5805#endif
5806#ifdef VK_USE_PLATFORM_MIR_KHR
5807 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5808 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5809#endif
5810#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5811 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5812 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5813#endif
5814#ifdef VK_USE_PLATFORM_ANDROID_KHR
5815 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5816#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005817 };
5818
Chris Forbes8a13e272016-11-02 17:43:34 +13005819 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5820 if (!strcmp(wsi_instance_commands[i].name, name))
5821 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005822 }
5823
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005824 return nullptr;
5825}
5826
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005827} // namespace parameter_validation
5828
5829// vk_layer_logging.h expects these to be defined
5830
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005831VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5832 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5833 const VkAllocationCallbacks *pAllocator,
5834 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005835 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005836}
5837
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005838VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5839 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005840 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005841}
5842
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005843VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5844 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5845 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005846 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005847}
5848
5849// loader-layer interface v0
5850
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005851VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5852 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005853 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005854}
5855
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005856VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5857 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005858 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005859}
5860
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005861VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5862 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005863 // the layer command handles VK_NULL_HANDLE just fine internally
5864 assert(physicalDevice == VK_NULL_HANDLE);
5865 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005866}
5867
5868VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5869 const char *pLayerName, uint32_t *pCount,
5870 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005871 // the layer command handles VK_NULL_HANDLE just fine internally
5872 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005873 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005874}
5875
5876VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005877 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005878}
5879
5880VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005881 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005882}