blob: a724cabf6df817ede6b0761f61e9818e442f2bb7 [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
26#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060027#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30
31#include <iostream>
32#include <string>
33#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050034#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060035#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060036#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060038#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070039#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060040#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041#include "vk_enum_validate_helper.h"
42#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060043
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_table.h"
45#include "vk_layer_data.h"
46#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060047#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070048#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060049
Mark Lobodzinski739391a2016-03-17 15:08:18 -060050#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070051
Chia-I Wu1a6b1932016-05-13 14:07:36 +080052namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060053
Cody Northrop55443ef2015-09-28 15:09:32 -060054struct layer_data {
Chia-I Wua570b7c2016-05-16 07:48:14 +080055 VkInstance instance;
56
Jeremy Hayes99a96322015-06-26 12:48:09 -060057 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070058 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060059
Ian Elliotted6b5ac2016-04-28 09:08:13 -060060 // The following are for keeping track of the temporary callbacks that can
61 // be used in vkCreateInstance and vkDestroyInstance:
62 uint32_t num_tmp_callbacks;
63 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
64 VkDebugReportCallbackEXT *tmp_callbacks;
65
Jon Ashburn5484e0c2016-03-08 17:48:44 -070066 // TODO: Split instance/device structs
67 // Device Data
68 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060069 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Mark Lobodzinskia4932512016-06-27 15:13:00 -060070 VkPhysicalDeviceLimits device_limits;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060071 VkPhysicalDeviceFeatures physical_device_features;
72 VkPhysicalDevice physical_device;
Michael Lentinebdf744f2016-01-27 15:43:43 -060073
Mark Lobodzinskia4932512016-06-27 15:13:00 -060074 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060075 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
76 physical_device_features{}, physical_device{} {};
Cody Northrop55443ef2015-09-28 15:09:32 -060077};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050078
Jon Ashburn5484e0c2016-03-08 17:48:44 -070079static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060080static device_table_map pc_device_table_map;
81static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060082
Jeremy Hayes99a96322015-06-26 12:48:09 -060083// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070084debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060085 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060086 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060087#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060088 fprintf(stderr, "MID: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060089#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060090 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060091
92 return data->report_data;
93}
94
95// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070096debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060097 dispatch_key key = get_dispatch_key(object);
98 layer_data *data = get_my_data_ptr(key, layer_data_map);
99#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -0600100 fprintf(stderr, "MDD: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600101#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -0600102 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600103 return data->report_data;
104}
105
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600106static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600107
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600108 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600109}
110
Chia-I Wu01ca2372016-05-13 14:37:49 +0800111VKAPI_ATTR VkResult VKAPI_CALL
112CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
113 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700114 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700115 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600116
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700117 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700118 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600119 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600120 }
121
122 return result;
123}
124
Chia-I Wu01ca2372016-05-13 14:37:49 +0800125VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance,
126 VkDebugReportCallbackEXT msgCallback,
127 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700128 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700129 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600130
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700131 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700132 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600133}
134
Chia-I Wu01ca2372016-05-13 14:37:49 +0800135VKAPI_ATTR void VKAPI_CALL
136DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
137 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700138 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
139 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700140}
141
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700142static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600143
Chia-I Wu3384db82016-05-16 07:30:58 +0800144static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600145 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800146};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700147
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700148static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600149 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700150 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
151 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
152 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
153 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
154 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 -0700155 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700156 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600157 return false;
158 }
159
160 return true;
161}
162
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700163static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
164 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600165 return "unrecognized enumerator";
166 }
167
168 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600185 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
192 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
195 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600197 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
198 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800200 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600201 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700202 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800203 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600204 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700205 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700206 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
207 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600208
209 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700210 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600211 enumeratorString += string;
212
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700213 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600214 enumeratorString += '|';
215 }
216 }
217
218 return enumeratorString;
219}
220
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700221static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
222 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
223 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
224 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
225 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
226 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600227 return false;
228 }
229
230 return true;
231}
232
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700233static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
234 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600235 return "unrecognized enumerator";
236 }
237
238 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600240 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
241 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700242 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600243 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600244 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
247 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
250 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
253 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800255 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600256 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700257 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600258 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
259 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700260 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800261 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600262 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263
264 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700265 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266 enumeratorString += string;
267
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700268 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600269 enumeratorString += '|';
270 }
271 }
272
273 return enumeratorString;
274}
275
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700276static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
277 VkQueueFlagBits allFlags =
278 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
279 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600280 return false;
281 }
282
283 return true;
284}
285
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
287 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600288 return "unrecognized enumerator";
289 }
290
291 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800293 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600294 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600296 strings.push_back("VK_QUEUE_COMPUTE_BIT");
297 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700298 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800299 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600300 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700301 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600302 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
303 }
304
305 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700306 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600307 enumeratorString += string;
308
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700309 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600310 enumeratorString += '|';
311 }
312 }
313
314 return enumeratorString;
315}
316
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700317static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
318 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
319 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
320 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
321 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600322 return false;
323 }
324
325 return true;
326}
327
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700328static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
329 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600330 return "unrecognized enumerator";
331 }
332
333 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600335 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
336 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800338 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600339 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600341 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
342 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700343 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800344 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700346 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800347 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600348 }
349
350 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700351 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600352 enumeratorString += string;
353
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700354 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600355 enumeratorString += '|';
356 }
357 }
358
359 return enumeratorString;
360}
361
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700362static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700363 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700364 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600365 return false;
366 }
367
368 return true;
369}
370
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700371static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
372 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600373 return "unrecognized enumerator";
374 }
375
376 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700377 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800378 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600379 }
380
381 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700382 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600383 enumeratorString += string;
384
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700385 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600386 enumeratorString += '|';
387 }
388 }
389
390 return enumeratorString;
391}
392
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700393static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
394 VkSparseImageFormatFlagBits allFlags =
395 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
396 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
397 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600398 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600399 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600400
401 return true;
402}
403
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
405 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600406 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600407 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600408
409 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700410 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800411 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700413 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800414 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600415 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700416 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800417 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600418 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600419
420 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422 enumeratorString += string;
423
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700424 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600425 enumeratorString += '|';
426 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600427 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428
429 return enumeratorString;
430}
431
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700432static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700433 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700434 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600435 return false;
436 }
437
438 return true;
439}
440
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700441static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
442 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600443 return "unrecognized enumerator";
444 }
445
446 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700447 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600448 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
449 }
450
451 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700452 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600453 enumeratorString += string;
454
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700455 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600456 enumeratorString += '|';
457 }
458 }
459
460 return enumeratorString;
461}
462
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700463static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
464 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
465 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
466 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
467 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
468 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600469 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
470 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
471 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700472 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 return false;
474 }
475
476 return true;
477}
478
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700479static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
480 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600481 return "unrecognized enumerator";
482 }
483
484 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700485 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700486 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600502 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700504 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600505 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700507 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600508 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700510 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600511 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700512 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700513 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700515 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700516 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600517 }
518
519 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700520 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600521 enumeratorString += string;
522
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700523 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600524 enumeratorString += '|';
525 }
526 }
527
528 return enumeratorString;
529}
530
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700531static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
532 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
533 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
534 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600535 return false;
536 }
537
538 return true;
539}
540
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700541static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
542 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600543 return "unrecognized enumerator";
544 }
545
546 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700547 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600548 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
549 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600551 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
552 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700553 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600554 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
555 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700556 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600557 strings.push_back("VK_QUERY_RESULT_64_BIT");
558 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600559
560 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700561 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600562 enumeratorString += string;
563
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700564 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600565 enumeratorString += '|';
566 }
567 }
568
569 return enumeratorString;
570}
571
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700572static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
573 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
574 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
575 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
576 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
577 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600578 return false;
579 }
580
581 return true;
582}
583
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700584static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
585 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600586 return "unrecognized enumerator";
587 }
588
589 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600591 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
592 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
601 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
604 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800606 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600607 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700608 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600609 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
610 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700611 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800612 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700614 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600615 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
616 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617
618 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700619 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620 enumeratorString += string;
621
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700622 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600623 enumeratorString += '|';
624 }
625 }
626
627 return enumeratorString;
628}
629
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700630static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
631 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
632 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
633 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600634 return false;
635 }
636
637 return true;
638}
639
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700640static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
641 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600642 return "unrecognized enumerator";
643 }
644
645 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700646 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600647 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
648 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700649 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600650 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
651 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700652 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600653 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600654 }
655
656 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700657 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600658 enumeratorString += string;
659
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700660 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600661 enumeratorString += '|';
662 }
663 }
664
665 return enumeratorString;
666}
667
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700668static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
669 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
670 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
671 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
672 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600673 return false;
674 }
675
676 return true;
677}
678
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700679static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
680 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600681 return "unrecognized enumerator";
682 }
683
684 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
687 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600689 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
690 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700691 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600692 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
693 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700694 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600695 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
696 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700697 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600698 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600699 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700
701 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700702 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 enumeratorString += string;
704
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700705 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600706 enumeratorString += '|';
707 }
708 }
709
710 return enumeratorString;
711}
712
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700713static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
714 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
715 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
716 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717 return false;
718 }
719
720 return true;
721}
722
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700723static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
724 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600725 return "unrecognized enumerator";
726 }
727
728 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700729 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800730 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600731 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700732 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800733 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600734 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700735 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800736 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600737 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700738 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800739 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600740 }
741
742 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700743 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600744 enumeratorString += string;
745
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700746 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600747 enumeratorString += '|';
748 }
749 }
750
751 return enumeratorString;
752}
753
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700754static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
755 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
756 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
757 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600758 return false;
759 }
760
761 return true;
762}
763
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700764static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
765 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600766 return "unrecognized enumerator";
767 }
768
769 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700770 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600771 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
772 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700773 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600774 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
775 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600777 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600778 }
779
780 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700781 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600782 enumeratorString += string;
783
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700784 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600785 enumeratorString += '|';
786 }
787 }
788
789 return enumeratorString;
790}
791
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
793 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
794 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
795 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
796 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600797 return false;
798 }
799
800 return true;
801}
802
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700803static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
804 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600805 return "unrecognized enumerator";
806 }
807
808 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700809 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600810 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600811 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600814 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600816 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
817 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600819 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
820 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600822 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600823 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700824 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600825 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600826 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700827 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600828 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600829 }
830
831 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700832 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600833 enumeratorString += string;
834
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700835 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600836 enumeratorString += '|';
837 }
838 }
839
840 return enumeratorString;
841}
842
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700843static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800844 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700845 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
846 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
847 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
848 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
849 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
850 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 -0700851 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700852 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 return false;
854 }
855
856 return true;
857}
858
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700859static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
860 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600861 return "unrecognized enumerator";
862 }
863
864 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800866 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
867 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800869 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600875 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700881 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600884 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600887 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600890 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600896 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600899 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
900 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700902 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600903 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600905 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
906 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700907 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600908 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
909 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700910 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600911 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
912 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700913 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600914 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600915 }
916
917 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700918 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600919 enumeratorString += string;
920
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700921 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600922 enumeratorString += '|';
923 }
924 }
925
926 return enumeratorString;
927}
928
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700929static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800930 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700931 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
932 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
933 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
934 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
935 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 +0800936
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700937 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600938 return false;
939 }
940
941 return true;
942}
943
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700944static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
945 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600946 return "unrecognized enumerator";
947 }
948
949 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800951 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600952 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600985 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800987 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600988 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800990 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600991 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700992 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800993 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600994 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700995 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800996 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600997 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700998 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800999 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001000 }
1001
1002 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001003 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001004 enumeratorString += string;
1005
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001006 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001007 enumeratorString += '|';
1008 }
1009 }
1010
1011 return enumeratorString;
1012}
1013
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001014static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1015 VkCommandPoolCreateFlagBits allFlags =
1016 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1017 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001018 return false;
1019 }
1020
1021 return true;
1022}
1023
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001024static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1025 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001026 return "unrecognized enumerator";
1027 }
1028
1029 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001030 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001031 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001032 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001033 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001034 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001035 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001036
1037 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001038 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039 enumeratorString += string;
1040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001041 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001042 enumeratorString += '|';
1043 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001044 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045
1046 return enumeratorString;
1047}
1048
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001049static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001050 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001051 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001052 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001053 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001054
1055 return true;
1056}
1057
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001058static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1059 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001060 return "unrecognized enumerator";
1061 }
1062
1063 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001064 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001065 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001066 }
1067
1068 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001069 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 enumeratorString += string;
1071
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001072 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001073 enumeratorString += '|';
1074 }
1075 }
1076
1077 return enumeratorString;
1078}
1079
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001080static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1081 VkCommandBufferUsageFlags allFlags =
1082 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1083 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1084 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001085 return false;
1086 }
1087
1088 return true;
1089}
1090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1092 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001093 return "unrecognized enumerator";
1094 }
1095
1096 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001097 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001098 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001099 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001100 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001101 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001102 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001103 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001104 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001105 }
1106
1107 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001109 enumeratorString += string;
1110
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001111 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001112 enumeratorString += '|';
1113 }
1114 }
1115
1116 return enumeratorString;
1117}
1118
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001120 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001121 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001122 return false;
1123 }
1124
1125 return true;
1126}
1127
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001128static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1129 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001130 return "unrecognized enumerator";
1131 }
1132
1133 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001134 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001135 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001136 }
1137
1138 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001139 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001140 enumeratorString += string;
1141
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001142 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001143 enumeratorString += '|';
1144 }
1145 }
1146
1147 return enumeratorString;
1148}
1149
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001150static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1151 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1152 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1153 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001154 return false;
1155 }
1156
1157 return true;
1158}
1159
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001160static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1161 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001162 return "unrecognized enumerator";
1163 }
1164
1165 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001166 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001169 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001172 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001173 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001175 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001176 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1177 }
1178
1179 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001180 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001181 enumeratorString += string;
1182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001183 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001184 enumeratorString += '|';
1185 }
1186 }
1187
1188 return enumeratorString;
1189}
1190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001191static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001192 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001193 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001194 return false;
1195 }
1196
1197 return true;
1198}
1199
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001200static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1201 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001202 return "unrecognized enumerator";
1203 }
1204
1205 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001206 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001207 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001208 }
1209
1210 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001211 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001212 enumeratorString += string;
1213
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001214 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001215 enumeratorString += '|';
1216 }
1217 }
1218
1219 return enumeratorString;
1220}
1221
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001222static const int MaxParamCheckerStringLength = 256;
1223
Dustin Graves080069b2016-04-05 13:48:15 -06001224static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1225 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001226 assert(apiName != nullptr);
1227 assert(stringName != nullptr);
1228 assert(validateString != nullptr);
1229
Dustin Graves080069b2016-04-05 13:48:15 -06001230 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001231
1232 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1233
1234 if (result == VK_STRING_ERROR_NONE) {
1235 return skipCall;
1236 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001237 skipCall =
1238 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1239 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001240 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001241 skipCall =
1242 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1243 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001244 }
1245 return skipCall;
1246}
1247
Dustin Gravesde628532016-04-21 16:30:17 -06001248static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1249 uint32_t index) {
1250 assert(device_data != nullptr);
1251 debug_report_data *report_data = device_data->report_data;
1252 bool skip_call = false;
1253
1254 if (index == VK_QUEUE_FAMILY_IGNORED) {
1255 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1256 "PARAMCHECK", "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
1257 } else {
1258 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1259 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1260 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1261 "PARAMCHECK", "%s: %s (%d) must be one of the indices specified when the device was created, via "
1262 "the VkDeviceQueueCreateInfo structure.",
1263 function_name, parameter_name, index);
1264 return false;
1265 }
1266 }
1267
1268 return skip_call;
1269}
1270
1271static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1272 const uint32_t count, const uint32_t *indices) {
1273 assert(device_data != nullptr);
1274 debug_report_data *report_data = device_data->report_data;
1275 bool skip_call = false;
1276
1277 if (indices != nullptr) {
1278 for (uint32_t i = 0; i < count; i++) {
1279 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1280 skip_call |=
1281 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1282 "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
1283 } else {
1284 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1285 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1286 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1287 "PARAMCHECK", "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1288 "created, via the VkDeviceQueueCreateInfo structure.",
1289 function_name, parameter_name, i, indices[i]);
1290 return false;
1291 }
1292 }
1293 }
1294 }
1295
1296 return skip_call;
1297}
1298
Chia-I Wu01ca2372016-05-13 14:37:49 +08001299VKAPI_ATTR VkResult VKAPI_CALL
1300CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001301 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001302
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001303 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001304 assert(chain_info != nullptr);
1305 assert(chain_info->u.pLayerInfo != nullptr);
1306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001307 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1308 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001309 if (fpCreateInstance == NULL) {
1310 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001311 }
1312
Dustin Graves842621d2016-03-03 14:17:08 -07001313 // Advance the link info for the next element on the chain
1314 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1315
1316 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001317
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001318 if (result == VK_SUCCESS) {
1319 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1320 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001321
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001322 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001323
Chia-I Wua570b7c2016-05-16 07:48:14 +08001324 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001325 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1326 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001327
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001328 // Look for one or more debug report create info structures
1329 // and setup a callback(s) for each one found.
1330 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1331 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1332 if (my_instance_data->num_tmp_callbacks > 0) {
1333 // Setup the temporary callback(s) here to catch early issues:
1334 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1335 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1336 // Failure of setting up one or more of the callback.
1337 // Therefore, clean up and don't use those callbacks:
1338 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1339 my_instance_data->num_tmp_callbacks = 0;
1340 }
1341 }
1342 }
1343
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001344 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001345
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001346 // Ordinarily we'd check these before calling down the chain, but none of the layer
1347 // support is in place until now, if we survive we can report the issue now.
1348 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001349
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001350 if (pCreateInfo->pApplicationInfo) {
1351 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1352 validate_string(my_instance_data->report_data, "vkCreateInstance",
1353 "pCreateInfo->VkApplicationInfo->pApplicationName",
1354 pCreateInfo->pApplicationInfo->pApplicationName);
1355 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001356
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001357 if (pCreateInfo->pApplicationInfo->pEngineName) {
1358 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1359 pCreateInfo->pApplicationInfo->pEngineName);
1360 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001361 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001362
1363 // Disable the tmp callbacks:
1364 if (my_instance_data->num_tmp_callbacks > 0) {
1365 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1366 my_instance_data->tmp_callbacks);
1367 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001368 }
1369
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001370 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001371}
1372
Chia-I Wu01ca2372016-05-13 14:37:49 +08001373VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001374 // Grab the key before the instance is destroyed.
1375 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001376 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001377 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001378 assert(my_data != NULL);
1379
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001380 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1381 bool callback_setup = false;
1382 if (my_data->num_tmp_callbacks > 0) {
1383 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1384 my_data->tmp_callbacks)) {
1385 callback_setup = true;
1386 }
1387 }
1388
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001389 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001390
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001391 // Disable and cleanup the temporary callback(s):
1392 if (callback_setup) {
1393 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1394 }
1395 if (my_data->num_tmp_callbacks > 0) {
1396 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1397 my_data->num_tmp_callbacks = 0;
1398 }
1399
Dustin Graves080069b2016-04-05 13:48:15 -06001400 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001401 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001402 pTable->DestroyInstance(instance, pAllocator);
1403
1404 // Clean up logging callback, if any
1405 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001406 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1407 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001408 my_data->logging_callback.pop_back();
1409 }
1410
1411 layer_debug_report_destroy_instance(mid(instance));
1412 layer_data_map.erase(pTable);
1413
1414 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001415 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001416 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001417}
1418
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001419VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1420 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001421 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001422 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001423 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001424 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001425
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001426 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001427
Dustin Graves080069b2016-04-05 13:48:15 -06001428 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001429 result = get_dispatch_table(pc_instance_table_map, instance)
1430 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001431
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001432 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001433 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1434 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1435 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1436 // Save the supported features for each physical device
1437 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1438 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1439 }
1440 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001441 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001442 return result;
1443}
1444
Chia-I Wu01ca2372016-05-13 14:37:49 +08001445VKAPI_ATTR void VKAPI_CALL
1446GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001447 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001448 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001450
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001451 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001452
Dustin Graves080069b2016-04-05 13:48:15 -06001453 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001455 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001456}
1457
Chia-I Wu01ca2372016-05-13 14:37:49 +08001458VKAPI_ATTR void VKAPI_CALL
1459GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001460 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001461 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001462 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001463
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001464 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001465
Dustin Graves080069b2016-04-05 13:48:15 -06001466 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001467 get_dispatch_table(pc_instance_table_map, physicalDevice)
1468 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001470}
1471
Chia-I Wu01ca2372016-05-13 14:37:49 +08001472VKAPI_ATTR VkResult VKAPI_CALL
1473GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1474 VkImageUsageFlags usage, VkImageCreateFlags flags,
1475 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001476 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001477 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001478 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001479 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001480
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001481 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001482 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001483
Dustin Graves080069b2016-04-05 13:48:15 -06001484 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001485 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1486 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1487 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001488
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001489 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490 }
Chia-I Wu17241042015-10-31 00:31:16 +08001491
1492 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001493}
1494
Chia-I Wu01ca2372016-05-13 14:37:49 +08001495VKAPI_ATTR void VKAPI_CALL
1496GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001497 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001498 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001499 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001500
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001501 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502
Dustin Graves080069b2016-04-05 13:48:15 -06001503 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001505 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001506}
1507
Chia-I Wu01ca2372016-05-13 14:37:49 +08001508VKAPI_ATTR void VKAPI_CALL
1509GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1510 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001511 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001514
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001515 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001516 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001517
Dustin Graves080069b2016-04-05 13:48:15 -06001518 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001519 get_dispatch_table(pc_instance_table_map, physicalDevice)
1520 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001521 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001522}
1523
Chia-I Wu01ca2372016-05-13 14:37:49 +08001524VKAPI_ATTR void VKAPI_CALL
1525GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001526 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001527 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001528 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001529
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001530 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001531
Dustin Graves080069b2016-04-05 13:48:15 -06001532 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001533 get_dispatch_table(pc_instance_table_map, physicalDevice)
1534 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001535 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001536}
1537
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001538void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1539 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001540 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001541
1542 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1543 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1544 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001545 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1546 INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001547 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1548 "structure.",
1549 i);
1550 } else {
1551 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001552 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001553
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001554 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1555 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1556 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1557 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001558 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1559 __LINE__, INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001560 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1561 "between 0 and 1. Actual value is %f",
1562 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1563 }
1564 }
1565 }
1566
1567 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1568 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001569 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1570 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001571 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1572 "of queue families.",
1573 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001574 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1575 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1576 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001577 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1578 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001579 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1580 "queues for the given family index.",
1581 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001582 }
Michael Lentine774704f2016-01-27 13:36:46 -06001583 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001584 }
1585}
1586
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001587void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001588 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001589
1590 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1591 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1592 my_device_data->queueFamilyIndexMap.insert(
1593 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1594 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001595 }
1596}
1597
Chia-I Wu01ca2372016-05-13 14:37:49 +08001598VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice,
1599 const VkDeviceCreateInfo *pCreateInfo,
1600 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001601 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001602 * NOTE: We do not validate physicalDevice or any dispatchable
1603 * object as the first parameter. We couldn't get here if it was wrong!
1604 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001605
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001606 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001607 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001608 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001609 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001610
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001611 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001612
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001613 if (pCreateInfo != NULL) {
1614 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001615 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001616 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1617 pCreateInfo->ppEnabledLayerNames[i]);
1618 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001619 }
Michael Lentine774704f2016-01-27 13:36:46 -06001620
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001621 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001622 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001623 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1624 pCreateInfo->ppEnabledExtensionNames[i]);
1625 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001626 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001627 }
1628
Dustin Graves080069b2016-04-05 13:48:15 -06001629 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001630 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001631 assert(chain_info != nullptr);
1632 assert(chain_info->u.pLayerInfo != nullptr);
1633
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001634 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1635 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001636 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001637 if (fpCreateDevice == NULL) {
1638 return VK_ERROR_INITIALIZATION_FAILED;
1639 }
1640
1641 // Advance the link info for the next element on the chain
1642 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1643
1644 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001645
1646 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1647
1648 if (result == VK_SUCCESS) {
1649 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1650 assert(my_device_data != nullptr);
1651
1652 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1653 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1654
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001655
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001656 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001657 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1658 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001659 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001660 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001661
1662 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1663 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001664
1665 // Query and save physical device limits for this device
1666 VkPhysicalDeviceProperties device_properties = {};
1667 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1668 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001669 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001670 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001671 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001672
Jeremy Hayes99a96322015-06-26 12:48:09 -06001673 return result;
1674}
1675
Chia-I Wu01ca2372016-05-13 14:37:49 +08001676VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001677 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001678 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001679 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1680 assert(my_data != NULL);
1681
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001682 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001683
Dustin Graves080069b2016-04-05 13:48:15 -06001684 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001685 layer_debug_report_destroy_device(device);
1686
Jeremy Hayes99a96322015-06-26 12:48:09 -06001687#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001688 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001689#endif
1690
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001691 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001692 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001693 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001694 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001695}
1696
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001697bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001698 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001699 assert(my_device_data != nullptr);
1700
Dustin Gravesde628532016-04-21 16:30:17 -06001701 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001702
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001703 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001704 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001705 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1706 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001707 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1708 "was created.",
1709 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001710 return false;
1711 }
1712 return true;
1713}
1714
Chia-I Wu01ca2372016-05-13 14:37:49 +08001715VKAPI_ATTR void VKAPI_CALL
1716GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001717 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001718 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001719 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001720
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001721 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001722
Dustin Graves080069b2016-04-05 13:48:15 -06001723 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001724 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1725
1726 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001727 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001728}
1729
Chia-I Wu01ca2372016-05-13 14:37:49 +08001730VKAPI_ATTR VkResult VKAPI_CALL
1731QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001732 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001733 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001734 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001735 assert(my_data != NULL);
1736
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001737 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001738
Dustin Graves080069b2016-04-05 13:48:15 -06001739 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001740 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1741
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001742 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001743 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001744
Jeremy Hayes99a96322015-06-26 12:48:09 -06001745 return result;
1746}
1747
Chia-I Wu01ca2372016-05-13 14:37:49 +08001748VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001749 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1750 assert(my_data != NULL);
1751
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001752 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001753
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001754 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001755
1756 return result;
1757}
1758
Chia-I Wu01ca2372016-05-13 14:37:49 +08001759VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001760 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1761 assert(my_data != NULL);
1762
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001763 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001765 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001766
1767 return result;
1768}
1769
Chia-I Wu01ca2372016-05-13 14:37:49 +08001770VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1772 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001773 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001774 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001775 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001776
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001777 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001778
Dustin Graves080069b2016-04-05 13:48:15 -06001779 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001780 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1781
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001782 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001783 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001784
1785 return result;
1786}
1787
Chia-I Wu01ca2372016-05-13 14:37:49 +08001788VKAPI_ATTR void VKAPI_CALL
1789FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001790 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001791 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001792 assert(my_data != NULL);
1793
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001794 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001795
Dustin Graves080069b2016-04-05 13:48:15 -06001796 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001797 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001798 }
1799}
1800
Chia-I Wu01ca2372016-05-13 14:37:49 +08001801VKAPI_ATTR VkResult VKAPI_CALL
1802MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001803 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001804 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001805 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001806 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001807
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001808 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001809
Dustin Graves080069b2016-04-05 13:48:15 -06001810 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001811 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1812
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001813 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001814 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001815
1816 return result;
1817}
1818
Chia-I Wu01ca2372016-05-13 14:37:49 +08001819VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001820 bool skipCall = false;
1821 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1822 assert(my_data != NULL);
1823
1824 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1825
1826 if (!skipCall) {
1827 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1828 }
1829}
1830
Chia-I Wu01ca2372016-05-13 14:37:49 +08001831VKAPI_ATTR VkResult VKAPI_CALL
1832FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001833 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001834 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001835 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001836 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001837
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001838 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001839
Dustin Graves080069b2016-04-05 13:48:15 -06001840 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001841 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1842
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001843 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001844 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001845
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001846 return result;
1847}
1848
Chia-I Wu01ca2372016-05-13 14:37:49 +08001849VKAPI_ATTR VkResult VKAPI_CALL
1850InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001851 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001852 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001853 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001854 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001855
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001856 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001857
Dustin Graves080069b2016-04-05 13:48:15 -06001858 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001859 result =
1860 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001861
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001862 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001863 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001864
Tony Barbourb1250542015-04-16 19:23:13 -06001865 return result;
1866}
1867
Chia-I Wu01ca2372016-05-13 14:37:49 +08001868VKAPI_ATTR void VKAPI_CALL
1869GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001870 bool skipCall = 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);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001873
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001874 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001875
Dustin Graves080069b2016-04-05 13:48:15 -06001876 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001879}
1880
Chia-I Wu01ca2372016-05-13 14:37:49 +08001881VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1882 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001883 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1884 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001885 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1886 assert(my_data != NULL);
1887
Dustin Graves20fd66f2016-04-18 18:33:21 -06001888 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001889
Dustin Graves20fd66f2016-04-18 18:33:21 -06001890 if (!skipCall) {
1891 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1892
1893 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1894 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001895
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001896 return result;
1897}
1898
Chia-I Wu01ca2372016-05-13 14:37:49 +08001899VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1900 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001901 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1902 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1904 assert(my_data != NULL);
1905
Dustin Graves20fd66f2016-04-18 18:33:21 -06001906 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001907
Dustin Graves20fd66f2016-04-18 18:33:21 -06001908 if (!skipCall) {
1909 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1910
1911 validate_result(my_data->report_data, "vkBindImageMemory", result);
1912 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001913
1914 return result;
1915}
1916
Chia-I Wu01ca2372016-05-13 14:37:49 +08001917VKAPI_ATTR void VKAPI_CALL
1918GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001919 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001920 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001921 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001922
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001923 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001924
Dustin Graves080069b2016-04-05 13:48:15 -06001925 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001926 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001928}
1929
Chia-I Wu01ca2372016-05-13 14:37:49 +08001930VKAPI_ATTR void VKAPI_CALL
1931GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001932 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001933 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001934 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001935
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001936 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001937
Dustin Graves080069b2016-04-05 13:48:15 -06001938 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001939 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001940 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001941}
1942
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001943bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1944 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1945 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001946 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001947 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1948 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001949 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1950 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001951 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1952 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001953 return false;
1954 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001955 }
1956
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001957 return true;
1958}
1959
Chia-I Wu01ca2372016-05-13 14:37:49 +08001960VKAPI_ATTR void VKAPI_CALL
1961GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1962 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001963 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001964 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001965 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001966
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001967 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001968 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001969
Dustin Graves080069b2016-04-05 13:48:15 -06001970 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001971 get_dispatch_table(pc_device_table_map, device)
1972 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001973
1974 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1975 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001976}
1977
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001978bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1979 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1980 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001981 if (pProperties != nullptr) {
1982 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1983 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001984 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1985 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1987 "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
Chia-I Wu01ca2372016-05-13 14:37:49 +08001995VKAPI_ATTR void VKAPI_CALL
1996GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1997 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1998 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001999 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002000 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002002
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002003 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002004 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002005
Dustin Graves080069b2016-04-05 13:48:15 -06002006 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002007 get_dispatch_table(pc_instance_table_map, physicalDevice)
2008 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2009 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002011 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2012 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002013 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002014}
2015
Chia-I Wu01ca2372016-05-13 14:37:49 +08002016VKAPI_ATTR VkResult VKAPI_CALL
2017QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002018 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002019 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002020 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002021 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002022
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002023 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002024
Dustin Graves080069b2016-04-05 13:48:15 -06002025 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002026 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2027
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002028 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002029 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002030
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002031 return result;
2032}
2033
Chia-I Wu01ca2372016-05-13 14:37:49 +08002034VKAPI_ATTR VkResult VKAPI_CALL
2035CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002036 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002037 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002038 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002039 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002040
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002041 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002042
Dustin Graves080069b2016-04-05 13:48:15 -06002043 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002044 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2045
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002046 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002047 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002048
2049 return result;
2050}
2051
Chia-I Wu01ca2372016-05-13 14:37:49 +08002052VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002053 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002054 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002055 assert(my_data != NULL);
2056
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002057 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002058
Dustin Graves080069b2016-04-05 13:48:15 -06002059 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002060 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002061 }
2062}
2063
Chia-I Wu01ca2372016-05-13 14:37:49 +08002064VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002065 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002066 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002067 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002068 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002069
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002070 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002071
Dustin Graves080069b2016-04-05 13:48:15 -06002072 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002073 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2074
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002075 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002076 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002077
2078 return result;
2079}
2080
Chia-I Wu01ca2372016-05-13 14:37:49 +08002081VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002082 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2083 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002084 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2085 assert(my_data != NULL);
2086
Dustin Graves20fd66f2016-04-18 18:33:21 -06002087 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002088
Dustin Graves20fd66f2016-04-18 18:33:21 -06002089 if (!skipCall) {
2090 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2091
2092 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2093 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002094
2095 return result;
2096}
2097
Chia-I Wu01ca2372016-05-13 14:37:49 +08002098VKAPI_ATTR VkResult VKAPI_CALL
2099WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002101 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002102 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002103 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002104
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002105 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002106
Dustin Graves080069b2016-04-05 13:48:15 -06002107 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2109
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002110 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002111 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002112
2113 return result;
2114}
2115
Chia-I Wu01ca2372016-05-13 14:37:49 +08002116VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002117 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2118 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002119 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002120 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002121 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002122
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002123 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002124
Dustin Graves080069b2016-04-05 13:48:15 -06002125 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002126 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2127
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002128 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002129 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002130
2131 return result;
2132}
2133
Chia-I Wu01ca2372016-05-13 14:37:49 +08002134VKAPI_ATTR void VKAPI_CALL
2135DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002136 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002138 assert(my_data != NULL);
2139
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002140 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002141
Dustin Graves080069b2016-04-05 13:48:15 -06002142 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002143 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002144 }
2145}
2146
Chia-I Wu01ca2372016-05-13 14:37:49 +08002147VKAPI_ATTR VkResult VKAPI_CALL
2148CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002149 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002150 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002151 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002152 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002153
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002154 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002155
Dustin Graves080069b2016-04-05 13:48:15 -06002156 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002157 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2158
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002159 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002160 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002161
2162 return result;
2163}
2164
Chia-I Wu01ca2372016-05-13 14:37:49 +08002165VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002166 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002167 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002168 assert(my_data != NULL);
2169
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002170 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002171
Dustin Graves080069b2016-04-05 13:48:15 -06002172 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002173 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002174 }
2175}
2176
Chia-I Wu01ca2372016-05-13 14:37:49 +08002177VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002178 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2179 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002180 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2181 assert(my_data != NULL);
2182
Dustin Graves20fd66f2016-04-18 18:33:21 -06002183 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002184
Dustin Graves20fd66f2016-04-18 18:33:21 -06002185 if (!skipCall) {
2186 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2187
2188 validate_result(my_data->report_data, "vkGetEventStatus", result);
2189 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002190
2191 return result;
2192}
2193
Chia-I Wu01ca2372016-05-13 14:37:49 +08002194VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002195 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2196 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002197 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2198 assert(my_data != NULL);
2199
Dustin Graves20fd66f2016-04-18 18:33:21 -06002200 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002201
Dustin Graves20fd66f2016-04-18 18:33:21 -06002202 if (!skipCall) {
2203 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2204
2205 validate_result(my_data->report_data, "vkSetEvent", result);
2206 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002207
2208 return result;
2209}
2210
Chia-I Wu01ca2372016-05-13 14:37:49 +08002211VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002212 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2213 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002214 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2215 assert(my_data != NULL);
2216
Dustin Graves20fd66f2016-04-18 18:33:21 -06002217 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002218
Dustin Graves20fd66f2016-04-18 18:33:21 -06002219 if (!skipCall) {
2220 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2221
2222 validate_result(my_data->report_data, "vkResetEvent", result);
2223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002224
2225 return result;
2226}
2227
Chia-I Wu01ca2372016-05-13 14:37:49 +08002228VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2229 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002230 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002231 bool skip_call = false;
2232 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2233 assert(device_data != nullptr);
2234 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002235
Dustin Gravesc900f572016-05-16 11:07:59 -06002236 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002237
Dustin Gravesc900f572016-05-16 11:07:59 -06002238 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2239 if (pCreateInfo != nullptr) {
2240 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2241 // VkQueryPipelineStatisticFlagBits values
2242 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2243 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2244 skip_call |=
2245 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2246 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2247 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2248 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2249 }
2250 }
2251
2252 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002253 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2254
Dustin Gravesc900f572016-05-16 11:07:59 -06002255 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002256 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002257
2258 return result;
2259}
2260
Chia-I Wu01ca2372016-05-13 14:37:49 +08002261VKAPI_ATTR void VKAPI_CALL
2262DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002263 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002264 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002265 assert(my_data != NULL);
2266
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002267 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002268
Dustin Graves080069b2016-04-05 13:48:15 -06002269 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002270 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002271 }
2272}
2273
Chia-I Wu01ca2372016-05-13 14:37:49 +08002274VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2275 uint32_t queryCount, size_t dataSize, void *pData,
2276 VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002277 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002278 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002279 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002280 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002281
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002282 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002283 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002284
Dustin Graves080069b2016-04-05 13:48:15 -06002285 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002286 result = get_dispatch_table(pc_device_table_map, device)
2287 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002288
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002289 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002290 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002291
2292 return result;
2293}
2294
Chia-I Wu01ca2372016-05-13 14:37:49 +08002295VKAPI_ATTR VkResult VKAPI_CALL
2296CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002297 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002298 bool skip_call = false;
2299 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2300 assert(device_data != nullptr);
2301 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002302
Dustin Gravesc900f572016-05-16 11:07:59 -06002303 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002304
Dustin Gravesc900f572016-05-16 11:07:59 -06002305 if (pCreateInfo != nullptr) {
2306 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2307 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2308 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2309 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2310 skip_call |=
2311 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2312 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2313 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2314 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002315
Dustin Gravesc900f572016-05-16 11:07:59 -06002316 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2317 // queueFamilyIndexCount uint32_t values
2318 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2319 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2320 __LINE__, REQUIRED_PARAMETER, LayerName,
2321 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2322 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2323 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2324 }
2325
2326 // Ensure that the queue family indices were specified at device creation
2327 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2328 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2329 }
2330 }
2331
2332 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002333 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2334
Dustin Gravesc900f572016-05-16 11:07:59 -06002335 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002336 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002337
2338 return result;
2339}
2340
Chia-I Wu01ca2372016-05-13 14:37:49 +08002341VKAPI_ATTR void VKAPI_CALL
2342DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002343 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002344 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002345 assert(my_data != NULL);
2346
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002347 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002348
Dustin Graves080069b2016-04-05 13:48:15 -06002349 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002350 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002351 }
2352}
2353
Chia-I Wu01ca2372016-05-13 14:37:49 +08002354VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2355 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002356 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002357 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002358 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002359 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002360
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002361 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002362
Dustin Graves080069b2016-04-05 13:48:15 -06002363 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002364 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2365
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002366 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002367 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002368
2369 return result;
2370}
2371
Chia-I Wu01ca2372016-05-13 14:37:49 +08002372VKAPI_ATTR void VKAPI_CALL
2373DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002374 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002375 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002376 assert(my_data != NULL);
2377
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002378 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002379
Dustin Graves080069b2016-04-05 13:48:15 -06002380 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002381 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002382 }
2383}
2384
Chia-I Wu01ca2372016-05-13 14:37:49 +08002385VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2386 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002387 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2388 bool skip_call = false;
2389 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002390 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002391 debug_report_data *report_data = device_data->report_data;
2392
2393 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2394
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002395 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002396 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002397 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002398 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2399 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2400 skip_call |=
2401 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2402 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2403 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2404 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002405
Dustin Gravesc900f572016-05-16 11:07:59 -06002406 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2407 // queueFamilyIndexCount uint32_t values
2408 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2409 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2410 __LINE__, REQUIRED_PARAMETER, LayerName,
2411 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2412 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2413 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2414 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002415
2416 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2417 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2418 }
2419
2420 // width, height, and depth members of extent must be greater than 0
2421 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2422 0u);
2423 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2424 0u);
2425 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2426 0u);
2427
2428 // mipLevels must be greater than 0
2429 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2430 0u);
2431
2432 // arrayLayers must be greater than 0
2433 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2434 0u);
2435
2436 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2437 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2438 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2439 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2440 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
2441 }
2442
2443 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2444 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2445 // extent.height must be equal
2446 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2447 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2448 skip_call |=
2449 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2450 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2451 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2452 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
2453 }
2454
2455 if (pCreateInfo->extent.depth != 1) {
2456 skip_call |=
2457 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2458 LayerName,
2459 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2460 }
2461 }
2462
2463 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2464 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2465 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2466 skip_call |= log_msg(
2467 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2468 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2469 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2470 }
2471
2472 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2473 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2474 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2475 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2476 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2477 LayerName,
2478 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2479 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002480 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002481 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002482
Dustin Gravesf8032f22016-05-11 18:31:44 -06002483 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002484 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2485
Dustin Gravesf8032f22016-05-11 18:31:44 -06002486 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002487 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002488
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002489 return result;
2490}
2491
Chia-I Wu01ca2372016-05-13 14:37:49 +08002492VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002493 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002494 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002495 assert(my_data != NULL);
2496
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002497 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002498
Dustin Graves080069b2016-04-05 13:48:15 -06002499 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002500 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002501 }
2502}
2503
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002504bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2505 if (pSubresource != nullptr) {
2506 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2507 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002508 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2509 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002510 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2511 return false;
2512 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002513 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002514
2515 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002516}
2517
Chia-I Wu01ca2372016-05-13 14:37:49 +08002518VKAPI_ATTR void VKAPI_CALL
2519GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002520 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002521 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002522 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002523
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002524 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525
Dustin Graves080069b2016-04-05 13:48:15 -06002526 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002527 PreGetImageSubresourceLayout(device, pSubresource);
2528
2529 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002530 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002531}
2532
Chia-I Wu01ca2372016-05-13 14:37:49 +08002533VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2534 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002535 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002536 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002537 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002538 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002539 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002540
Dustin Graves0b70a632016-04-27 17:44:56 -06002541 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002542
Dustin Graves0b70a632016-04-27 17:44:56 -06002543 if (pCreateInfo != nullptr) {
2544 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2545 if (pCreateInfo->subresourceRange.layerCount != 1) {
2546 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2547 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2548 "pCreateInfo->subresourceRange.layerCount must be 1",
2549 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2550 }
2551 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2552 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)) {
2553 if (pCreateInfo->subresourceRange.layerCount < 1) {
2554 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2555 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2556 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2557 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2558 }
2559 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2560 if (pCreateInfo->subresourceRange.layerCount != 6) {
2561 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2562 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2563 "pCreateInfo->subresourceRange.layerCount must be 6");
2564 }
2565 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2566 if ((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) {
2567 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2568 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2569 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2570 }
2571 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2572 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2573 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2574 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2575 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2576 }
2577
2578 if (pCreateInfo->subresourceRange.layerCount != 1) {
2579 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2580 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2581 "pCreateInfo->subresourceRange.layerCount must be 1");
2582 }
2583 }
2584 }
2585
2586 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002587 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2588
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002589 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002590 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002591
2592 return result;
2593}
2594
Chia-I Wu01ca2372016-05-13 14:37:49 +08002595VKAPI_ATTR void VKAPI_CALL
2596DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002597 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002598 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002599 assert(my_data != NULL);
2600
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002601 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002602
Dustin Graves080069b2016-04-05 13:48:15 -06002603 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002604 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002605 }
2606}
2607
Chia-I Wu01ca2372016-05-13 14:37:49 +08002608VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2609 const VkAllocationCallbacks *pAllocator,
2610 VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002611 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002612 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002613 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002614 assert(my_data != NULL);
2615
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002616 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002617
Dustin Graves080069b2016-04-05 13:48:15 -06002618 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002619 result =
2620 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002621
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002622 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002623 }
2624
Michael Lentine03d8e572015-09-15 14:59:14 -05002625 return result;
2626}
2627
Chia-I Wu01ca2372016-05-13 14:37:49 +08002628VKAPI_ATTR void VKAPI_CALL
2629DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002630 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002631 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002632 assert(my_data != NULL);
2633
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002634 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002635
Dustin Graves080069b2016-04-05 13:48:15 -06002636 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002637 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002638 }
2639}
2640
Chia-I Wu01ca2372016-05-13 14:37:49 +08002641VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2642 const VkAllocationCallbacks *pAllocator,
2643 VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002644 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002645 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002646 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002647 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002648
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002649 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002650
Dustin Graves080069b2016-04-05 13:48:15 -06002651 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002652 result =
2653 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002654
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002655 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002656 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002657
2658 return result;
2659}
2660
Chia-I Wu01ca2372016-05-13 14:37:49 +08002661VKAPI_ATTR void VKAPI_CALL
2662DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002663 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002664 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002665 assert(my_data != NULL);
2666
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002667 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002668
Dustin Graves080069b2016-04-05 13:48:15 -06002669 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002670 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002671 }
2672}
2673
Chia-I Wu01ca2372016-05-13 14:37:49 +08002674VKAPI_ATTR VkResult VKAPI_CALL
2675GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002676 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002677 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002679 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002680
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002681 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002682
Dustin Graves080069b2016-04-05 13:48:15 -06002683 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002684 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2685
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002686 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002687 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002688
2689 return result;
2690}
2691
Chia-I Wu01ca2372016-05-13 14:37:49 +08002692VKAPI_ATTR VkResult VKAPI_CALL
2693MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002694 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002695 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002696 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002697 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002698
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002699 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002700
Dustin Graves080069b2016-04-05 13:48:15 -06002701 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002702 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2703
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002704 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002705 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002706
2707 return result;
2708}
2709
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002710bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002711 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2712
2713 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 if (pCreateInfos != nullptr) {
2715 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2716 if (pCreateInfos->basePipelineIndex != -1) {
2717 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002718 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2719 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2721 "pCreateInfos->flags "
2722 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2723 return false;
2724 }
2725 }
2726
2727 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2728 if (pCreateInfos->basePipelineIndex != -1) {
2729 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002730 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2731 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002732 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2733 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2734 "VK_NULL_HANDLE");
2735 return false;
2736 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002737 }
2738 }
2739
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002740 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002741 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002742 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2743 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002744 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2745 "unrecognized enumerator");
2746 return false;
2747 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002748 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002749
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002750 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002751 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002752 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753 pCreateInfos[i].pStages[j].pName);
2754 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002755 }
2756
2757 return true;
2758}
2759
Chia-I Wu01ca2372016-05-13 14:37:49 +08002760VKAPI_ATTR VkResult VKAPI_CALL
2761CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2762 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2763 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002765 bool skip_call = false;
2766 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2767 assert(device_data != nullptr);
2768 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002769
Dustin Gravesc900f572016-05-16 11:07:59 -06002770 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2771 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002772
Dustin Gravesc900f572016-05-16 11:07:59 -06002773 if (pCreateInfos != nullptr) {
2774 for (uint32_t i = 0; i < createInfoCount; ++i) {
2775 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2776 if (pCreateInfos[i].pTessellationState == nullptr) {
2777 if (pCreateInfos[i].pStages != nullptr) {
2778 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2779 // pTessellationState must not be NULL
2780 bool has_control = false;
2781 bool has_eval = false;
2782
2783 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2784 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2785 has_control = true;
2786 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2787 has_eval = true;
2788 }
2789 }
2790
2791 if (has_control && has_eval) {
2792 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2793 __LINE__, REQUIRED_PARAMETER, LayerName,
2794 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2795 "control shader stage and a tessellation evaluation shader stage, "
2796 "pCreateInfos[%d].pTessellationState must not be NULL",
2797 i, i);
2798 }
2799 }
Dustin Graves629259b2016-05-30 16:14:27 -06002800 } else {
2801 skip_call |=
2802 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
2803 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL);
2804
2805 skip_call |=
2806 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2807 pCreateInfos[i].pTessellationState->flags);
2808
2809 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2810 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2811 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2812 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2813 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2814 i);
2815 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002816 }
2817
2818 if (pCreateInfos[i].pViewportState == nullptr) {
2819 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2820 // valid VkPipelineViewportStateCreateInfo structure
2821 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2822 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2823 skip_call |= log_msg(
2824 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2825 REQUIRED_PARAMETER, LayerName,
2826 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2827 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2828 i, i);
2829 }
2830 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002831 skip_call |=
2832 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
2833 pCreateInfos[i].pViewportState->pNext, 0, NULL);
2834
2835 skip_call |=
2836 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2837 pCreateInfos[i].pViewportState->flags);
2838
Dustin Gravesc900f572016-05-16 11:07:59 -06002839 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2840 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2841 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2842 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2843 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2844 i);
2845 }
2846
2847 if (pCreateInfos[i].pDynamicState != nullptr) {
2848 bool has_dynamic_viewport = false;
2849 bool has_dynamic_scissor = false;
2850
2851 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2852 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2853 has_dynamic_viewport = true;
2854 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2855 has_dynamic_scissor = true;
2856 }
2857 }
2858
2859 // viewportCount must be greater than 0
2860 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2861 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2862 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2863 __LINE__, REQUIRED_PARAMETER, LayerName,
2864 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2865 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2866 "must be greater than 0",
2867 i, i);
2868 }
2869
2870 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2871 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2872 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2873 skip_call |=
2874 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2875 __LINE__, REQUIRED_PARAMETER, LayerName,
2876 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2877 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2878 i, i);
2879 }
2880
2881 // scissorCount must be greater than 0
2882 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2883 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2884 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2885 __LINE__, REQUIRED_PARAMETER, LayerName,
2886 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2887 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2888 "must be greater than 0",
2889 i, i);
2890 }
2891
2892 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2893 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2894 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2895 skip_call |=
2896 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2897 __LINE__, REQUIRED_PARAMETER, LayerName,
2898 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2899 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2900 i, i);
2901 }
2902 }
2903 }
2904
2905 if (pCreateInfos[i].pMultisampleState == nullptr) {
2906 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2907 // a valid VkPipelineMultisampleStateCreateInfo structure
2908 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2909 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2910 skip_call |=
2911 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2912 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2913 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2914 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2915 i, i);
2916 }
Dustin Graves629259b2016-05-30 16:14:27 -06002917 } else {
2918 skip_call |=
2919 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
2920 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL);
2921
2922 skip_call |=
2923 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2924 pCreateInfos[i].pMultisampleState->flags);
2925
2926 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2927 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2928 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2929
2930 skip_call |= validate_array(
2931 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2932 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2933 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2934
2935 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2936 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2937 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2938
2939 skip_call |=
2940 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2941 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
2942
2943 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2944 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2945 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2946 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2947 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2948 i);
2949 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002950 }
2951
2952 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06002953 if (pCreateInfos[i].pDepthStencilState != nullptr) {
2954 skip_call |=
2955 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
2956 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL);
2957
2958 skip_call |=
2959 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
2960 pCreateInfos[i].pDepthStencilState->flags);
2961
2962 skip_call |=
2963 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
2964 pCreateInfos[i].pDepthStencilState->depthTestEnable);
2965
2966 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2967 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
2968 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
2969
2970 skip_call |= validate_ranged_enum(
2971 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
2972 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
2973
2974 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2975 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
2976 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
2977
2978 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2979 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
2980 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
2981
2982 skip_call |= validate_ranged_enum(
2983 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
2984 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
2985
2986 skip_call |= validate_ranged_enum(
2987 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
2988 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
2989
2990 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
2991 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
2992 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
2993 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
2994
2995 skip_call |= validate_ranged_enum(
2996 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
2997 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
2998
2999 skip_call |= validate_ranged_enum(
3000 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
3001 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3002
3003 skip_call |= validate_ranged_enum(
3004 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
3005 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3006
3007 skip_call |= validate_ranged_enum(
3008 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
3009 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3010
3011 skip_call |= validate_ranged_enum(
3012 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3013 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3014
3015 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3016 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3017 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3018 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3019 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3020 i);
3021 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003022 }
3023
3024 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3025 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003026 skip_call |=
3027 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
3028 pCreateInfos[i].pColorBlendState->pNext, 0, NULL);
3029
3030 skip_call |=
3031 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3032 pCreateInfos[i].pColorBlendState->flags);
3033
3034 skip_call |=
3035 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3036 pCreateInfos[i].pColorBlendState->logicOpEnable);
3037
3038 skip_call |= validate_array(
3039 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3040 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3041 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3042
3043 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3044 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3045 ++attachmentIndex) {
3046 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3047 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3048 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3049
3050 skip_call |= validate_ranged_enum(
3051 report_data, "vkCreateGraphicsPipelines",
3052 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3053 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3054 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3055
3056 skip_call |= validate_ranged_enum(
3057 report_data, "vkCreateGraphicsPipelines",
3058 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3059 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3060 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3061
3062 skip_call |= validate_ranged_enum(
3063 report_data, "vkCreateGraphicsPipelines",
3064 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3065 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3066
3067 skip_call |= validate_ranged_enum(
3068 report_data, "vkCreateGraphicsPipelines",
3069 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3070 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3071 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3072
3073 skip_call |= validate_ranged_enum(
3074 report_data, "vkCreateGraphicsPipelines",
3075 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3076 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3077 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3078
3079 skip_call |= validate_ranged_enum(
3080 report_data, "vkCreateGraphicsPipelines",
3081 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3082 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3083
3084 skip_call |=
3085 validate_flags(report_data, "vkCreateGraphicsPipelines",
3086 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3087 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3088 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3089 }
3090 }
3091
Dustin Gravesc900f572016-05-16 11:07:59 -06003092 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3093 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3094 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3095 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3096 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3097 i);
3098 }
3099
3100 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3101 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3102 skip_call |= validate_ranged_enum(
3103 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3104 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3105 }
3106 }
3107 }
3108 }
3109
3110 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003111 PreCreateGraphicsPipelines(device, pCreateInfos);
3112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003113 result = get_dispatch_table(pc_device_table_map, device)
3114 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003115
Dustin Gravesc900f572016-05-16 11:07:59 -06003116 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003117 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003118
3119 return result;
3120}
3121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003122bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003123 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003125 if (pCreateInfos != nullptr) {
3126 // TODO: Handle count!
3127 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003128 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003129 }
3130
3131 return true;
3132}
3133
Chia-I Wu01ca2372016-05-13 14:37:49 +08003134VKAPI_ATTR VkResult VKAPI_CALL
3135CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3136 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3137 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003138 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003139 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003140 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003141 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003142
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003143 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003144 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003145
Dustin Graves080069b2016-04-05 13:48:15 -06003146 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003147 PreCreateComputePipelines(device, pCreateInfos);
3148
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003149 result = get_dispatch_table(pc_device_table_map, device)
3150 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003151
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003152 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003153 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003154
3155 return result;
3156}
3157
Chia-I Wu01ca2372016-05-13 14:37:49 +08003158VKAPI_ATTR void VKAPI_CALL
3159DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003160 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003162 assert(my_data != NULL);
3163
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003164 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003165
Dustin Graves080069b2016-04-05 13:48:15 -06003166 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003167 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003168 }
3169}
3170
Chia-I Wu01ca2372016-05-13 14:37:49 +08003171VKAPI_ATTR VkResult VKAPI_CALL
3172CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3173 VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003174 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003175 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003176 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003177 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003178
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003179 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003180
Dustin Graves080069b2016-04-05 13:48:15 -06003181 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003182 result =
3183 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003184
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003185 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003186 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003187
3188 return result;
3189}
3190
Chia-I Wu01ca2372016-05-13 14:37:49 +08003191VKAPI_ATTR void VKAPI_CALL
3192DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003193 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003194 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003195 assert(my_data != NULL);
3196
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003197 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003198
Dustin Graves080069b2016-04-05 13:48:15 -06003199 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003200 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003201 }
3202}
3203
Chia-I Wu01ca2372016-05-13 14:37:49 +08003204VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3205 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003206 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003207 bool skip_call = false;
3208 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3209 assert(device_data != NULL);
3210 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003211
Dustin Gravesc900f572016-05-16 11:07:59 -06003212 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003213
Dustin Gravesc900f572016-05-16 11:07:59 -06003214 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3215 if (pCreateInfo != nullptr) {
3216 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3217 if (pCreateInfo->compareEnable == VK_TRUE) {
3218 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3219 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3220 }
3221
3222 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3223 // valid VkBorderColor value
3224 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3225 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3226 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3227 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3228 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3229 }
3230 }
3231
3232 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003233 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3234
Dustin Gravesc900f572016-05-16 11:07:59 -06003235 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003236 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003237
3238 return result;
3239}
3240
Chia-I Wu01ca2372016-05-13 14:37:49 +08003241VKAPI_ATTR void VKAPI_CALL
3242DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003243 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003245 assert(my_data != NULL);
3246
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003247 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003248
Dustin Graves080069b2016-04-05 13:48:15 -06003249 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003250 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003251 }
3252}
3253
Chia-I Wu01ca2372016-05-13 14:37:49 +08003254VKAPI_ATTR VkResult VKAPI_CALL
3255CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3256 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003257 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003258 bool skip_call = false;
3259 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3260 assert(device_data != nullptr);
3261 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003262
Dustin Gravesc900f572016-05-16 11:07:59 -06003263 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003264
Dustin Gravesc900f572016-05-16 11:07:59 -06003265 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3266 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3267 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3268 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3269 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3270 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3271 // valid VkSampler handles
3272 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3273 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3274 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3275 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3276 ++descriptor_index) {
3277 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3278 skip_call |=
3279 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3280 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3281 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3282 " specified as VK_NULL_HANDLE",
3283 i, descriptor_index);
3284 }
3285 }
3286 }
3287
3288 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3289 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3290 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3291 skip_call |=
3292 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3293 UNRECOGNIZED_VALUE, LayerName,
3294 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3295 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3296 i, i);
3297 }
3298 }
3299 }
3300 }
3301
3302 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003303 result =
3304 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003305
Dustin Gravesc900f572016-05-16 11:07:59 -06003306 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003307 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003308
3309 return result;
3310}
3311
Chia-I Wu01ca2372016-05-13 14:37:49 +08003312VKAPI_ATTR void VKAPI_CALL
3313DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003314 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003315 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003316 assert(my_data != NULL);
3317
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003318 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003319
Dustin Graves080069b2016-04-05 13:48:15 -06003320 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003321 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003322 }
3323}
3324
Chia-I Wu01ca2372016-05-13 14:37:49 +08003325VKAPI_ATTR VkResult VKAPI_CALL
3326CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3327 VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003328 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003329 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003330 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003331 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003332
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003333 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003334
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003335 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3336
Dustin Graves080069b2016-04-05 13:48:15 -06003337 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003338 result =
3339 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003340
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003341 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003342 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003343
3344 return result;
3345}
3346
Chia-I Wu01ca2372016-05-13 14:37:49 +08003347VKAPI_ATTR void VKAPI_CALL
3348DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003349 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003350 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003351 assert(my_data != NULL);
3352
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003353 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003354
Dustin Graves080069b2016-04-05 13:48:15 -06003355 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003356 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003357 }
3358}
3359
Chia-I Wu01ca2372016-05-13 14:37:49 +08003360VKAPI_ATTR VkResult VKAPI_CALL
3361ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003362 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3363 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003364 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3365 assert(my_data != NULL);
3366
Dustin Graves20fd66f2016-04-18 18:33:21 -06003367 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003368
Dustin Graves20fd66f2016-04-18 18:33:21 -06003369 if (!skipCall) {
3370 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3371
3372 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3373 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003374
3375 return result;
3376}
3377
Chia-I Wu01ca2372016-05-13 14:37:49 +08003378VKAPI_ATTR VkResult VKAPI_CALL
3379AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003380 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003381 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003382 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003383 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003384
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003385 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003386
Dustin Graves080069b2016-04-05 13:48:15 -06003387 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003388 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3389
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003390 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003391 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003392
3393 return result;
3394}
3395
Chia-I Wu01ca2372016-05-13 14:37:49 +08003396VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3397 uint32_t descriptorSetCount,
3398 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003399 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003400 bool skip_call = false;
3401 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3402 assert(device_data != nullptr);
3403 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003404
Dustin Gravesc900f572016-05-16 11:07:59 -06003405 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003406
Dustin Gravesc900f572016-05-16 11:07:59 -06003407 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3408 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3409 // validate_array()
3410 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3411 pDescriptorSets, true, true);
3412
3413 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003414 result = get_dispatch_table(pc_device_table_map, device)
3415 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003416
Dustin Gravesc900f572016-05-16 11:07:59 -06003417 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003418 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003419
3420 return result;
3421}
3422
Chia-I Wu01ca2372016-05-13 14:37:49 +08003423VKAPI_ATTR void VKAPI_CALL
3424UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3425 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003426 bool skip_call = false;
3427 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3428 assert(device_data != NULL);
3429 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003430
Dustin Gravesc900f572016-05-16 11:07:59 -06003431 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3432 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003433
Dustin Gravesc900f572016-05-16 11:07:59 -06003434 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3435 if (pDescriptorWrites != NULL) {
3436 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3437 // descriptorCount must be greater than 0
3438 if (pDescriptorWrites[i].descriptorCount == 0) {
3439 skip_call |=
3440 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3441 REQUIRED_PARAMETER, LayerName,
3442 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3443 }
3444
3445 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3446 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3447 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3448 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3449 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3450 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3451 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3452 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3453 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3454 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3455 __LINE__, REQUIRED_PARAMETER, LayerName,
3456 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3457 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3458 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3459 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3460 i, i);
3461 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3462 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3463 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3464 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3465 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3466 ++descriptor_index) {
3467 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3468 "pDescriptorWrites[i].pImageInfo[i].imageView",
3469 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3470 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3471 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3472 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3473 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3474 }
3475 }
3476 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3477 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3478 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3479 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3480 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3481 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3482 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3483 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3484 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3485 __LINE__, REQUIRED_PARAMETER, LayerName,
3486 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3487 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3488 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3489 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3490 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003491 } else {
3492 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3493 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3494 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3495 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3496 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003497 }
3498 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3499 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3500 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3501 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3502 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3503 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3504 __LINE__, REQUIRED_PARAMETER, LayerName,
3505 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3506 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3507 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3508 i, i);
3509 } else {
3510 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3511 ++descriptor_index) {
3512 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3513 "pDescriptorWrites[i].pTexelBufferView[i]",
3514 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3515 }
3516 }
3517 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003518
3519 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3520 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3521 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3522 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3523 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3524 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3525 skip_call |=
3526 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3527 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, "PARAMCHECK",
3528 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3529 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3530 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3531 }
3532 }
3533 }
3534 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3535 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3536 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3537 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3538 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3539 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3540 skip_call |=
3541 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3542 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, "PARAMCHECK",
3543 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3544 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3545 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3546 }
3547 }
3548 }
3549 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003550 }
3551 }
3552
3553 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003554 get_dispatch_table(pc_device_table_map, device)
3555 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003556 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003557}
3558
Chia-I Wu01ca2372016-05-13 14:37:49 +08003559VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3560 const VkAllocationCallbacks *pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003561 VkFramebuffer *pFramebuffer) {
3562 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003563 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003564 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003565 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003566
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003567 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003568
Dustin Graves080069b2016-04-05 13:48:15 -06003569 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003570 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3571
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003572 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003573 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003574
3575 return result;
3576}
3577
Chia-I Wu01ca2372016-05-13 14:37:49 +08003578VKAPI_ATTR void VKAPI_CALL
3579DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003580 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003581 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003582 assert(my_data != NULL);
3583
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003584 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003585
Dustin Graves080069b2016-04-05 13:48:15 -06003586 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003587 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003588 }
3589}
3590
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003591bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3592 bool skip_call = false;
3593 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3594
3595 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3596 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3597 skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3598 __LINE__, DEVICE_LIMIT, "DL",
3599 "Cannot create a render pass with %d color attachments. Max is %d.",
3600 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3601 }
3602 }
3603 return skip_call;
3604}
3605
Chia-I Wu01ca2372016-05-13 14:37:49 +08003606VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3607 const VkAllocationCallbacks *pAllocator,
3608 VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003609 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003610 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003611 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003612 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003613
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003614 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003615 skipCall |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003616
Dustin Graves080069b2016-04-05 13:48:15 -06003617 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003618 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3619
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003620 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003621 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003622
3623 return result;
3624}
3625
Chia-I Wu01ca2372016-05-13 14:37:49 +08003626VKAPI_ATTR void VKAPI_CALL
3627DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003628 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003629 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003630 assert(my_data != NULL);
3631
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003632 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003633
Dustin Graves080069b2016-04-05 13:48:15 -06003634 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003635 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003636 }
3637}
3638
Chia-I Wu01ca2372016-05-13 14:37:49 +08003639VKAPI_ATTR void VKAPI_CALL
3640GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003641 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003642 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003643 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003644
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003645 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003646
Dustin Graves080069b2016-04-05 13:48:15 -06003647 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003648 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003649 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003650}
3651
Chia-I Wu01ca2372016-05-13 14:37:49 +08003652VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3653 const VkAllocationCallbacks *pAllocator,
3654 VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003655 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003656 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003657 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003658 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003659
Dustin Gravesde628532016-04-21 16:30:17 -06003660 skipCall |=
3661 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003662
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003663 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003664
Dustin Graves080069b2016-04-05 13:48:15 -06003665 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003666 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3667
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003668 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003669 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003670
3671 return result;
3672}
3673
Chia-I Wu01ca2372016-05-13 14:37:49 +08003674VKAPI_ATTR void VKAPI_CALL
3675DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003676 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003677 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003678 assert(my_data != NULL);
3679
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003680 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003681
Dustin Graves080069b2016-04-05 13:48:15 -06003682 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003683 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003684 }
3685}
3686
Chia-I Wu01ca2372016-05-13 14:37:49 +08003687VKAPI_ATTR VkResult VKAPI_CALL
3688ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003689 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3690 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003691 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3692 assert(my_data != NULL);
3693
Dustin Graves20fd66f2016-04-18 18:33:21 -06003694 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003695
Dustin Graves20fd66f2016-04-18 18:33:21 -06003696 if (!skipCall) {
3697 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3698
3699 validate_result(my_data->report_data, "vkResetCommandPool", result);
3700 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003701
3702 return result;
3703}
3704
Chia-I Wu01ca2372016-05-13 14:37:49 +08003705VKAPI_ATTR VkResult VKAPI_CALL
3706AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003707 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003708 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003709 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003710 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003711
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003712 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003713
Dustin Graves080069b2016-04-05 13:48:15 -06003714 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003715 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3716
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003717 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003718 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003719
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003720 return result;
3721}
3722
Chia-I Wu01ca2372016-05-13 14:37:49 +08003723VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3724 uint32_t commandBufferCount,
3725 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003726 bool skip_call = false;
3727 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3728 assert(device_data != nullptr);
3729 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003730
Dustin Gravesc900f572016-05-16 11:07:59 -06003731 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003732
Dustin Gravesc900f572016-05-16 11:07:59 -06003733 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3734 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3735 // validate_array()
3736 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3737 pCommandBuffers, true, true);
3738
3739 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003740 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003741 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003742 }
3743}
3744
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003745bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3746 bool skip_call = false;
3747 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3748 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3749
3750 if (pInfo != NULL) {
3751 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3752 skip_call |=
3753 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
3754 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, "PARAMCHECK",
3755 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3756 "inheritedQueries.");
3757 }
3758
3759 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3760 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3761 skip_call |=
3762 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
3763 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, "PARAMCHECK",
3764 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3765 "valid combination of VkQueryControlFlagBits.",
3766 pInfo->queryFlags);
3767 }
3768 }
3769 return skip_call;
3770}
3771
3772VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003774 bool skip_call = false;
3775 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3776 assert(device_data != nullptr);
3777 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003778
Dustin Gravesc900f572016-05-16 11:07:59 -06003779 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003780
Dustin Gravesc900f572016-05-16 11:07:59 -06003781 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3782 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3783 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3784 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3785 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3786
3787 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003788 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
3789 pBeginInfo->pInheritanceInfo->pNext, 0, NULL);
3790
3791 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3792 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3793
Dustin Gravesc900f572016-05-16 11:07:59 -06003794 // TODO: This only needs to be validated when the inherited queries feature is enabled
3795 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3796 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3797
3798 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3799 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3800 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3801 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3802 }
3803
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003804 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3805
Dustin Gravesc900f572016-05-16 11:07:59 -06003806 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003807 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3808
Dustin Gravesc900f572016-05-16 11:07:59 -06003809 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003810 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003811
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003812 return result;
3813}
3814
Chia-I Wu01ca2372016-05-13 14:37:49 +08003815VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003816 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3817 assert(my_data != NULL);
3818
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003819 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003820
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003821 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003822
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003823 return result;
3824}
3825
Chia-I Wu01ca2372016-05-13 14:37:49 +08003826VKAPI_ATTR VkResult VKAPI_CALL
3827ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003828 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003829 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3830 assert(my_data != NULL);
3831
Dustin Graves16d18972016-05-09 17:36:57 -06003832 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003833
Dustin Graves16d18972016-05-09 17:36:57 -06003834 if (!skip_call) {
3835 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3836
3837 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3838 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003839
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003840 return result;
3841}
3842
Chia-I Wu01ca2372016-05-13 14:37:49 +08003843VKAPI_ATTR void VKAPI_CALL
3844CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003845 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003846 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3847 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003848
Dustin Graves29148ff2016-03-23 19:44:00 -06003849 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3850
Dustin Graves080069b2016-04-05 13:48:15 -06003851 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003852 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3853 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003854}
3855
Chia-I Wu01ca2372016-05-13 14:37:49 +08003856VKAPI_ATTR void VKAPI_CALL
3857CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003858 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003860 assert(my_data != NULL);
3861
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003862 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003863
Dustin Graves080069b2016-04-05 13:48:15 -06003864 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003865 get_dispatch_table(pc_device_table_map, commandBuffer)
3866 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003867 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003868}
3869
Chia-I Wu01ca2372016-05-13 14:37:49 +08003870VKAPI_ATTR void VKAPI_CALL
3871CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003872 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003873 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003874 assert(my_data != NULL);
3875
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003876 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003877
Dustin Graves080069b2016-04-05 13:48:15 -06003878 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003879 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003881}
3882
Chia-I Wu01ca2372016-05-13 14:37:49 +08003883VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003884 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003885}
3886
Chia-I Wu01ca2372016-05-13 14:37:49 +08003887VKAPI_ATTR void VKAPI_CALL
3888CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003889 get_dispatch_table(pc_device_table_map, commandBuffer)
3890 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003891}
3892
Chia-I Wu01ca2372016-05-13 14:37:49 +08003893VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003894 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003895 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003896 assert(my_data != NULL);
3897
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003898 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003899
Dustin Graves080069b2016-04-05 13:48:15 -06003900 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003901 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3902 }
Cody Northrop12365112015-08-17 11:10:49 -06003903}
3904
Chia-I Wu01ca2372016-05-13 14:37:49 +08003905VKAPI_ATTR void VKAPI_CALL
3906CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003907 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003908}
3909
Chia-I Wu01ca2372016-05-13 14:37:49 +08003910VKAPI_ATTR void VKAPI_CALL
3911CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003912 bool skipCall = false;
3913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3914 assert(my_data != NULL);
3915
3916 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3917
3918 if (!skipCall) {
3919 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3920 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003921}
3922
Chia-I Wu01ca2372016-05-13 14:37:49 +08003923VKAPI_ATTR void VKAPI_CALL
3924CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003925 bool skipCall = false;
3926 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3927 assert(my_data != NULL);
3928
3929 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3930
3931 if (!skipCall) {
3932 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3933 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003934}
3935
Chia-I Wu01ca2372016-05-13 14:37:49 +08003936VKAPI_ATTR void VKAPI_CALL
3937CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003938 bool skipCall = false;
3939 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3940 assert(my_data != NULL);
3941
3942 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3943
3944 if (!skipCall) {
3945 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3946 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003947}
3948
Chia-I Wu01ca2372016-05-13 14:37:49 +08003949VKAPI_ATTR void VKAPI_CALL
3950CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3951 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3952 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003953 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003954 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003955 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003956
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003957 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003958 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003959
Dustin Graves080069b2016-04-05 13:48:15 -06003960 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003961 get_dispatch_table(pc_device_table_map, commandBuffer)
3962 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3963 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003964 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003965}
3966
Chia-I Wu01ca2372016-05-13 14:37:49 +08003967VKAPI_ATTR void VKAPI_CALL
3968CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003969 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003970 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3971 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003972
Dustin Graves29148ff2016-03-23 19:44:00 -06003973 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3974
Dustin Graves080069b2016-04-05 13:48:15 -06003975 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003976 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3977 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003978}
3979
Chia-I Wu01ca2372016-05-13 14:37:49 +08003980VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3981 uint32_t bindingCount, const VkBuffer *pBuffers,
3982 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003983 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003984 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003985 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003986
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003987 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003988
Dustin Graves080069b2016-04-05 13:48:15 -06003989 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003990 get_dispatch_table(pc_device_table_map, commandBuffer)
3991 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003992 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003993}
3994
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003995bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3996 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003997 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003998 // 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 -07003999 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004000 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4001 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004002 return false;
4003 }
4004
4005 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004006 // 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 -07004007 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004008 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4009 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004010 return false;
4011 }
4012
4013 return true;
4014}
4015
Chia-I Wu01ca2372016-05-13 14:37:49 +08004016VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4017 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004018 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004019
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004020 get_dispatch_table(pc_device_table_map, commandBuffer)
4021 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004022}
4023
Chia-I Wu01ca2372016-05-13 14:37:49 +08004024VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
4025 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
4026 uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004027 get_dispatch_table(pc_device_table_map, commandBuffer)
4028 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004029}
4030
Chia-I Wu01ca2372016-05-13 14:37:49 +08004031VKAPI_ATTR void VKAPI_CALL
4032CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004033 bool skipCall = false;
4034 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4035 assert(my_data != NULL);
4036
4037 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
4038
4039 if (!skipCall) {
4040 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4041 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004042}
4043
Chia-I Wu01ca2372016-05-13 14:37:49 +08004044VKAPI_ATTR void VKAPI_CALL
4045CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004046 bool skipCall = false;
4047 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4048 assert(my_data != NULL);
4049
4050 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
4051
4052 if (!skipCall) {
4053 get_dispatch_table(pc_device_table_map, commandBuffer)
4054 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4055 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004056}
4057
Chia-I Wu01ca2372016-05-13 14:37:49 +08004058VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004059 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004060}
4061
Chia-I Wu01ca2372016-05-13 14:37:49 +08004062VKAPI_ATTR void VKAPI_CALL
4063CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004064 bool skipCall = false;
4065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4066 assert(my_data != NULL);
4067
4068 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
4069
4070 if (!skipCall) {
4071 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4072 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004073}
4074
Chia-I Wu01ca2372016-05-13 14:37:49 +08004075VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4076 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004077 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004078 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004079 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004080
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004081 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004082
Dustin Graves080069b2016-04-05 13:48:15 -06004083 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004084 get_dispatch_table(pc_device_table_map, commandBuffer)
4085 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004086 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004087}
4088
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004089bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4090 if (pRegions != nullptr) {
4091 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4092 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004093 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4094 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004095 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4096 return false;
4097 }
4098 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4099 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004100 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4101 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004102 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4103 return false;
4104 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004105 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004106
4107 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004108}
4109
Chia-I Wu01ca2372016-05-13 14:37:49 +08004110VKAPI_ATTR void VKAPI_CALL
4111CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4112 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004113 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004114 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004115 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004116
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004117 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004118 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004119
Dustin Graves080069b2016-04-05 13:48:15 -06004120 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004121 PreCmdCopyImage(commandBuffer, pRegions);
4122
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004123 get_dispatch_table(pc_device_table_map, commandBuffer)
4124 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004125 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004126}
4127
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004128bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4129 if (pRegions != nullptr) {
4130 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4131 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004132 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4133 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004134 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4135 return false;
4136 }
4137 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4138 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004139 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4140 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004141 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4142 return false;
4143 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004144 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004145
4146 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004147}
4148
Chia-I Wu01ca2372016-05-13 14:37:49 +08004149VKAPI_ATTR void VKAPI_CALL
4150CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4151 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06004152 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004153 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004154 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004155
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004156 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004157 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004158
Dustin Graves080069b2016-04-05 13:48:15 -06004159 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004160 PreCmdBlitImage(commandBuffer, pRegions);
4161
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004162 get_dispatch_table(pc_device_table_map, commandBuffer)
4163 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004164 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004165}
4166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004167bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4168 if (pRegions != nullptr) {
4169 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4170 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004171 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4172 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004173 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4174 "enumerator");
4175 return false;
4176 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004177 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004178
4179 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004180}
4181
Chia-I Wu01ca2372016-05-13 14:37:49 +08004182VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4183 VkImage dstImage, VkImageLayout dstImageLayout,
4184 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004185 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004187 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004188
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004189 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004190 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004191
Dustin Graves080069b2016-04-05 13:48:15 -06004192 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004193 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4194
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004195 get_dispatch_table(pc_device_table_map, commandBuffer)
4196 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004197 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004198}
4199
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004200bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4201 if (pRegions != nullptr) {
4202 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4203 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004204 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4205 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004206 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4207 "enumerator");
4208 return false;
4209 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004210 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004211
4212 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004213}
4214
Chia-I Wu01ca2372016-05-13 14:37:49 +08004215VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4216 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4217 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004218 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004219 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004220 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004221
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004222 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004223 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004224
Dustin Graves080069b2016-04-05 13:48:15 -06004225 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004226 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4227
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004228 get_dispatch_table(pc_device_table_map, commandBuffer)
4229 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004230 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004231}
4232
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004233VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4234 VkDeviceSize dataSize, const uint32_t *pData) {
4235 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004237 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004238
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004239 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004240
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004241 if (dstOffset & 3) {
4242 skip_call |=
4243 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4244 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4",
4245 dstOffset);
4246 }
4247
4248 if ((dataSize <= 0) || (dataSize > 65536)) {
4249 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4250 INVALID_USAGE, "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4251 "), must be greater than zero and less than or equal to 65536",
4252 dataSize);
4253 } else if (dataSize & 3) {
4254 skip_call |=
4255 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4256 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4",
4257 dataSize);
4258 }
4259
4260 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261 get_dispatch_table(pc_device_table_map, commandBuffer)
4262 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004263 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004264}
4265
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004266VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4267 VkDeviceSize size, uint32_t data) {
4268 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4270 assert(my_data != NULL);
4271
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004272 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004273
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004274 if (dstOffset & 3) {
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004275 skip_call |=
4276 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4277 "PARAMCHECK", "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4",
4278 dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004279 }
4280
4281 if (size != VK_WHOLE_SIZE) {
4282 if (size <= 0) {
4283 skip_call |= log_msg(
4284 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004285 "PARAMCHECK", "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004286 } else if (size & 3) {
4287 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004288 INVALID_USAGE, "PARAMCHECK",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004289 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4290 }
4291 }
4292
4293 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004294 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4295 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004296}
4297
Chia-I Wu01ca2372016-05-13 14:37:49 +08004298VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4299 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4300 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004301 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004302 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004303 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004304
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004305 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004306
Dustin Graves080069b2016-04-05 13:48:15 -06004307 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004308 get_dispatch_table(pc_device_table_map, commandBuffer)
4309 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004310 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004311}
4312
Chia-I Wu01ca2372016-05-13 14:37:49 +08004313VKAPI_ATTR void VKAPI_CALL
4314CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4315 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4316 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004317 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004318 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004319 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004320
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004321 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004322 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004323
Dustin Graves080069b2016-04-05 13:48:15 -06004324 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004325 get_dispatch_table(pc_device_table_map, commandBuffer)
4326 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004327 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328}
4329
Chia-I Wu01ca2372016-05-13 14:37:49 +08004330VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4331 const VkClearAttachment *pAttachments, uint32_t rectCount,
4332 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004333 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004334 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004335 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004336
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004337 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004338
Dustin Graves080069b2016-04-05 13:48:15 -06004339 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004340 get_dispatch_table(pc_device_table_map, commandBuffer)
4341 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004342 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004343}
4344
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004345bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4346 if (pRegions != nullptr) {
4347 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4348 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4349 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004350 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4351 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004352 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4353 return false;
4354 }
4355 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4356 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4357 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004358 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4359 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004360 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4361 return false;
4362 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004363 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004364
4365 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004366}
4367
Chia-I Wu01ca2372016-05-13 14:37:49 +08004368VKAPI_ATTR void VKAPI_CALL
4369CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4370 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004371 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004372 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004373 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004374
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004375 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004376 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004377
Dustin Graves080069b2016-04-05 13:48:15 -06004378 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004379 PreCmdResolveImage(commandBuffer, pRegions);
4380
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004381 get_dispatch_table(pc_device_table_map, commandBuffer)
4382 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004383 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004384}
4385
Chia-I Wu01ca2372016-05-13 14:37:49 +08004386VKAPI_ATTR void VKAPI_CALL
4387CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004388 bool skipCall = false;
4389 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4390 assert(my_data != NULL);
4391
4392 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4393
4394 if (!skipCall) {
4395 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4396 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004397}
4398
Chia-I Wu01ca2372016-05-13 14:37:49 +08004399VKAPI_ATTR void VKAPI_CALL
4400CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004401 bool skipCall = false;
4402 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4403 assert(my_data != NULL);
4404
4405 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4406
4407 if (!skipCall) {
4408 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4409 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004410}
4411
Chia-I Wu01ca2372016-05-13 14:37:49 +08004412VKAPI_ATTR void VKAPI_CALL
4413CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4414 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4415 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4416 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004417 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004419 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004420
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004421 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004422 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4423 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004424
Dustin Graves080069b2016-04-05 13:48:15 -06004425 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004426 get_dispatch_table(pc_device_table_map, commandBuffer)
4427 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4428 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004429 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004430}
4431
Chia-I Wu01ca2372016-05-13 14:37:49 +08004432VKAPI_ATTR void VKAPI_CALL
4433CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4434 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4435 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4436 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004437 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004439 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004440
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004441 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004442 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4443 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004444
Dustin Graves080069b2016-04-05 13:48:15 -06004445 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004446 get_dispatch_table(pc_device_table_map, commandBuffer)
4447 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4448 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004449 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004450}
4451
Chia-I Wu01ca2372016-05-13 14:37:49 +08004452VKAPI_ATTR void VKAPI_CALL
4453CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004454 bool skipCall = false;
4455 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4456 assert(my_data != NULL);
4457
4458 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4459
4460 if (!skipCall) {
4461 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4462 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004463}
4464
Chia-I Wu01ca2372016-05-13 14:37:49 +08004465VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004466 bool skipCall = false;
4467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4468 assert(my_data != NULL);
4469
4470 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4471
4472 if (!skipCall) {
4473 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4474 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004475}
4476
Chia-I Wu01ca2372016-05-13 14:37:49 +08004477VKAPI_ATTR void VKAPI_CALL
4478CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004479 bool skipCall = false;
4480 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4481 assert(my_data != NULL);
4482
4483 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4484
4485 if (!skipCall) {
4486 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4487 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004488}
4489
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004490bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4491 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004492
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004493 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004494
4495 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004496}
4497
Chia-I Wu01ca2372016-05-13 14:37:49 +08004498VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4499 VkQueryPool queryPool, uint32_t query) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004500 bool skipCall = false;
4501 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4502 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004503
Dustin Graves20fd66f2016-04-18 18:33:21 -06004504 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4505
4506 if (!skipCall) {
4507 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4508
4509 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4510 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004511}
4512
Chia-I Wu01ca2372016-05-13 14:37:49 +08004513VKAPI_ATTR void VKAPI_CALL
4514CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4515 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004516 bool skipCall = false;
4517 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4518 assert(my_data != NULL);
4519
4520 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4521 dstOffset, stride, flags);
4522
4523 if (!skipCall) {
4524 get_dispatch_table(pc_device_table_map, commandBuffer)
4525 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4526 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004527}
4528
Chia-I Wu01ca2372016-05-13 14:37:49 +08004529VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4530 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4531 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004532 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004533 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004534 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004535
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004536 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004537
Dustin Graves080069b2016-04-05 13:48:15 -06004538 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004539 get_dispatch_table(pc_device_table_map, commandBuffer)
4540 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004541 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004542}
4543
Chia-I Wu01ca2372016-05-13 14:37:49 +08004544VKAPI_ATTR void VKAPI_CALL
4545CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004546 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004547 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004548 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004549
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004550 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004551
Dustin Graves080069b2016-04-05 13:48:15 -06004552 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004553 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004554 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004555}
4556
Chia-I Wu01ca2372016-05-13 14:37:49 +08004557VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004558 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004559 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4560 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004561
Dustin Graves29148ff2016-03-23 19:44:00 -06004562 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4563
Dustin Graves080069b2016-04-05 13:48:15 -06004564 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004565 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4566 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004567}
4568
Chia-I Wu01ca2372016-05-13 14:37:49 +08004569VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004570 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004571}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004572
Chia-I Wu01ca2372016-05-13 14:37:49 +08004573VKAPI_ATTR void VKAPI_CALL
4574CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004575 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004576 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004577 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004578
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004579 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004580
Dustin Graves080069b2016-04-05 13:48:15 -06004581 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004582 get_dispatch_table(pc_device_table_map, commandBuffer)
4583 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004584 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004585}
4586
Chia-I Wub02600c2016-05-20 07:11:22 +08004587VKAPI_ATTR VkResult VKAPI_CALL
4588EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4589 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4590}
4591
4592VKAPI_ATTR VkResult VKAPI_CALL
4593EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
4594 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4595}
4596
4597VKAPI_ATTR VkResult VKAPI_CALL
4598EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
4599 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4600 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4601
4602 return VK_ERROR_LAYER_NOT_PRESENT;
4603}
4604
Chia-I Wu01ca2372016-05-13 14:37:49 +08004605VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4606 const char *pLayerName, uint32_t *pCount,
4607 VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004608 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004609 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004610 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004611
4612 assert(physicalDevice);
4613
4614 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4615 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004616}
4617
Chia-I Wuf9b01382016-05-16 07:37:41 +08004618static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004619intercept_core_instance_command(const char *name);
4620
4621static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004622intercept_core_device_command(const char *name);
4623
Chia-I Wu01ca2372016-05-13 14:37:49 +08004624VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08004625 assert(device);
4626
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004627 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4628
Dustin Graves080069b2016-04-05 13:48:15 -06004629 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004630 return NULL;
4631 }
4632
Chia-I Wuf9b01382016-05-16 07:37:41 +08004633 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
4634 if (proc)
4635 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004636
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004637 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004638 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004639 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004640}
4641
Chia-I Wu01ca2372016-05-13 14:37:49 +08004642VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08004643 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08004644 if (!proc)
4645 proc = intercept_core_device_command(funcName);
Chia-I Wu617f2a42016-05-16 07:41:17 +08004646 if (proc)
4647 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004648
Chia-I Wu617f2a42016-05-16 07:41:17 +08004649 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004650
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004651 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004652
Chia-I Wu617f2a42016-05-16 07:41:17 +08004653 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
4654 if (proc)
4655 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004656
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004657 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004658 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004659 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004660}
Chia-I Wu99f701c2016-05-13 14:06:08 +08004661
Chia-I Wuf9b01382016-05-16 07:37:41 +08004662static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004663intercept_core_instance_command(const char *name) {
4664 static const struct {
4665 const char *name;
4666 PFN_vkVoidFunction proc;
4667 } core_instance_commands[] = {
4668 { "vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr) },
4669 { "vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance) },
4670 { "vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance) },
4671 { "vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice) },
4672 { "vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices) },
4673 { "vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties) },
4674 { "vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures) },
4675 { "vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties) },
4676 { "vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties) },
4677 { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties) },
4678 { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties) },
4679 { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties) },
Chia-I Wub02600c2016-05-20 07:11:22 +08004680 { "vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties) },
4681 { "vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties) },
4682 { "vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08004683 { "vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties) },
4684 };
4685
4686 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
4687 if (!strcmp(core_instance_commands[i].name, name))
4688 return core_instance_commands[i].proc;
4689 }
4690
4691 return nullptr;
4692}
4693
4694static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004695intercept_core_device_command(const char *name) {
4696 static const struct {
4697 const char *name;
4698 PFN_vkVoidFunction proc;
4699 } core_device_commands[] = {
4700 { "vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr) },
4701 { "vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice) },
4702 { "vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue) },
4703 { "vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit) },
4704 { "vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle) },
4705 { "vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle) },
4706 { "vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory) },
4707 { "vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory) },
4708 { "vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory) },
4709 { "vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory) },
4710 { "vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges) },
4711 { "vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges) },
4712 { "vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment) },
4713 { "vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory) },
4714 { "vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory) },
4715 { "vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence) },
4716 { "vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence) },
4717 { "vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences) },
4718 { "vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus) },
4719 { "vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences) },
4720 { "vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore) },
4721 { "vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore) },
4722 { "vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent) },
4723 { "vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent) },
4724 { "vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus) },
4725 { "vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent) },
4726 { "vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent) },
4727 { "vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool) },
4728 { "vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool) },
4729 { "vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults) },
4730 { "vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer) },
4731 { "vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer) },
4732 { "vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView) },
4733 { "vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView) },
4734 { "vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage) },
4735 { "vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage) },
4736 { "vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout) },
4737 { "vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView) },
4738 { "vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView) },
4739 { "vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule) },
4740 { "vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule) },
4741 { "vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache) },
4742 { "vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache) },
4743 { "vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData) },
4744 { "vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches) },
4745 { "vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines) },
4746 { "vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines) },
4747 { "vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline) },
4748 { "vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout) },
4749 { "vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout) },
4750 { "vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler) },
4751 { "vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler) },
4752 { "vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout) },
4753 { "vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout) },
4754 { "vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool) },
4755 { "vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool) },
4756 { "vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool) },
4757 { "vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets) },
4758 { "vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets) },
4759 { "vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets) },
4760 { "vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport) },
4761 { "vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor) },
4762 { "vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth) },
4763 { "vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias) },
4764 { "vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants) },
4765 { "vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds) },
4766 { "vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask) },
4767 { "vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask) },
4768 { "vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference) },
4769 { "vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers) },
4770 { "vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers) },
4771 { "vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer) },
4772 { "vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer) },
4773 { "vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer) },
4774 { "vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline) },
4775 { "vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets) },
4776 { "vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers) },
4777 { "vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer) },
4778 { "vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw) },
4779 { "vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed) },
4780 { "vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect) },
4781 { "vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect) },
4782 { "vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch) },
4783 { "vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect) },
4784 { "vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer) },
4785 { "vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage) },
4786 { "vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage) },
4787 { "vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage) },
4788 { "vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer) },
4789 { "vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer) },
4790 { "vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer) },
4791 { "vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage) },
4792 { "vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage) },
4793 { "vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent) },
4794 { "vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent) },
4795 { "vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents) },
4796 { "vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier) },
4797 { "vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery) },
4798 { "vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery) },
4799 { "vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool) },
4800 { "vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp) },
4801 { "vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults) },
4802 { "vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer) },
4803 { "vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer) },
4804 { "vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass) },
4805 { "vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass) },
4806 { "vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity) },
4807 { "vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool) },
4808 { "vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool) },
4809 { "vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool) },
4810 { "vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass) },
4811 { "vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass) },
4812 };
4813
4814 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
4815 if (!strcmp(core_device_commands[i].name, name))
4816 return core_device_commands[i].proc;
4817 }
4818
4819 return nullptr;
4820}
4821
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004822} // namespace parameter_validation
4823
4824// vk_layer_logging.h expects these to be defined
4825
4826VKAPI_ATTR VkResult VKAPI_CALL
4827vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4828 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004829 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004830}
4831
4832VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
4833 VkDebugReportCallbackEXT msgCallback,
4834 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004835 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004836}
4837
4838VKAPI_ATTR void VKAPI_CALL
4839vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
4840 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004841 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004842}
4843
4844// loader-layer interface v0
4845
Chia-I Wu99f701c2016-05-13 14:06:08 +08004846VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4847vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004848 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004849}
4850
4851VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4852vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004853 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004854}
4855
4856VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4857vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004858 // the layer command handles VK_NULL_HANDLE just fine internally
4859 assert(physicalDevice == VK_NULL_HANDLE);
4860 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004861}
4862
4863VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4864 const char *pLayerName, uint32_t *pCount,
4865 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004866 // the layer command handles VK_NULL_HANDLE just fine internally
4867 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08004868 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004869}
4870
4871VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004872 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004873}
4874
4875VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004876 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004877}