blob: d6ffe63b329a9e06d4776316a588ba2b01fed10c [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 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001712
Michael Lentinebdf744f2016-01-27 15:43:43 -06001713 return true;
1714}
1715
Chia-I Wu01ca2372016-05-13 14:37:49 +08001716VKAPI_ATTR void VKAPI_CALL
1717GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001718 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001720 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001721
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001722 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001723
Dustin Graves080069b2016-04-05 13:48:15 -06001724 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001725 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1726
1727 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001728 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001729}
1730
Chia-I Wu01ca2372016-05-13 14:37:49 +08001731VKAPI_ATTR VkResult VKAPI_CALL
1732QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001733 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001734 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001735 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001736 assert(my_data != NULL);
1737
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001738 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001739
Dustin Graves080069b2016-04-05 13:48:15 -06001740 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001741 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1742
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001743 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001744 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001745
Jeremy Hayes99a96322015-06-26 12:48:09 -06001746 return result;
1747}
1748
Chia-I Wu01ca2372016-05-13 14:37:49 +08001749VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001750 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1751 assert(my_data != NULL);
1752
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001753 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001754
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001755 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001756
1757 return result;
1758}
1759
Chia-I Wu01ca2372016-05-13 14:37:49 +08001760VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001761 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1762 assert(my_data != NULL);
1763
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001764 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001765
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001766 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001767
1768 return result;
1769}
1770
Chia-I Wu01ca2372016-05-13 14:37:49 +08001771VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001772 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001774 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001776 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001777
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001778 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001779
Dustin Graves080069b2016-04-05 13:48:15 -06001780 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001781 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1782
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001783 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001784 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001785
1786 return result;
1787}
1788
Chia-I Wu01ca2372016-05-13 14:37:49 +08001789VKAPI_ATTR void VKAPI_CALL
1790FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001791 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001792 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001793 assert(my_data != NULL);
1794
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001795 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001796
Dustin Graves080069b2016-04-05 13:48:15 -06001797 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001798 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001799 }
1800}
1801
Chia-I Wu01ca2372016-05-13 14:37:49 +08001802VKAPI_ATTR VkResult VKAPI_CALL
1803MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001804 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001805 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001806 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001807 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001808
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001809 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001810
Dustin Graves080069b2016-04-05 13:48:15 -06001811 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001812 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1813
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001814 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001815 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001816
1817 return result;
1818}
1819
Chia-I Wu01ca2372016-05-13 14:37:49 +08001820VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001821 bool skipCall = false;
1822 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1823 assert(my_data != NULL);
1824
1825 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1826
1827 if (!skipCall) {
1828 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1829 }
1830}
1831
Chia-I Wu01ca2372016-05-13 14:37:49 +08001832VKAPI_ATTR VkResult VKAPI_CALL
1833FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001834 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001835 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001836 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001837 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001838
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001839 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001840
Dustin Graves080069b2016-04-05 13:48:15 -06001841 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1843
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001844 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001845 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001846
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001847 return result;
1848}
1849
Chia-I Wu01ca2372016-05-13 14:37:49 +08001850VKAPI_ATTR VkResult VKAPI_CALL
1851InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001852 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001853 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001854 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001855 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001856
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001857 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001858
Dustin Graves080069b2016-04-05 13:48:15 -06001859 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001860 result =
1861 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001862
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001863 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001864 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001865
Tony Barbourb1250542015-04-16 19:23:13 -06001866 return result;
1867}
1868
Chia-I Wu01ca2372016-05-13 14:37:49 +08001869VKAPI_ATTR void VKAPI_CALL
1870GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001871 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001872 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001873 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001874
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001875 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001876
Dustin Graves080069b2016-04-05 13:48:15 -06001877 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001879 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001880}
1881
Chia-I Wu01ca2372016-05-13 14:37:49 +08001882VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1883 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001884 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1885 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001886 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1887 assert(my_data != NULL);
1888
Dustin Graves20fd66f2016-04-18 18:33:21 -06001889 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001890
Dustin Graves20fd66f2016-04-18 18:33:21 -06001891 if (!skipCall) {
1892 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1893
1894 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1895 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001896
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001897 return result;
1898}
1899
Chia-I Wu01ca2372016-05-13 14:37:49 +08001900VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1901 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001902 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1903 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001904 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1905 assert(my_data != NULL);
1906
Dustin Graves20fd66f2016-04-18 18:33:21 -06001907 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001908
Dustin Graves20fd66f2016-04-18 18:33:21 -06001909 if (!skipCall) {
1910 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1911
1912 validate_result(my_data->report_data, "vkBindImageMemory", result);
1913 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001914
1915 return result;
1916}
1917
Chia-I Wu01ca2372016-05-13 14:37:49 +08001918VKAPI_ATTR void VKAPI_CALL
1919GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001920 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001922 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001923
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001924 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001925
Dustin Graves080069b2016-04-05 13:48:15 -06001926 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001928 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001929}
1930
Chia-I Wu01ca2372016-05-13 14:37:49 +08001931VKAPI_ATTR void VKAPI_CALL
1932GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001933 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001934 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001935 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001936
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001937 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001938
Dustin Graves080069b2016-04-05 13:48:15 -06001939 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001940 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001941 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001942}
1943
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001944bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1945 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1946 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001947 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001948 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1949 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001950 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1951 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001952 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1953 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001954 return false;
1955 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001956 }
1957
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001958 return true;
1959}
1960
Chia-I Wu01ca2372016-05-13 14:37:49 +08001961VKAPI_ATTR void VKAPI_CALL
1962GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1963 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001964 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001965 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001966 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001967
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001968 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001969 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001970
Dustin Graves080069b2016-04-05 13:48:15 -06001971 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001972 get_dispatch_table(pc_device_table_map, device)
1973 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001974
1975 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1976 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001977}
1978
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001979bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1980 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1981 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001982 if (pProperties != nullptr) {
1983 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1984 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001985 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1986 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001987 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1988 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001989 return false;
1990 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001991 }
1992
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001993 return true;
1994}
1995
Chia-I Wu01ca2372016-05-13 14:37:49 +08001996VKAPI_ATTR void VKAPI_CALL
1997GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1998 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1999 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06002000 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002001 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002002 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002003
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002004 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002005 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002006
Dustin Graves080069b2016-04-05 13:48:15 -06002007 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002008 get_dispatch_table(pc_instance_table_map, physicalDevice)
2009 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2010 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002011
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002012 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2013 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002014 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002015}
2016
Chia-I Wu01ca2372016-05-13 14:37:49 +08002017VKAPI_ATTR VkResult VKAPI_CALL
2018QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002019 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002020 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002022 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002023
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002024 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002025
Dustin Graves080069b2016-04-05 13:48:15 -06002026 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002027 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2028
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002029 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002030 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002031
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002032 return result;
2033}
2034
Chia-I Wu01ca2372016-05-13 14:37:49 +08002035VKAPI_ATTR VkResult VKAPI_CALL
2036CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002037 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002038 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002039 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002040 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002041
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002042 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002043
Dustin Graves080069b2016-04-05 13:48:15 -06002044 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002045 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2046
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002047 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002048 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002049
2050 return result;
2051}
2052
Chia-I Wu01ca2372016-05-13 14:37:49 +08002053VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002054 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002055 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002056 assert(my_data != NULL);
2057
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002058 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002059
Dustin Graves080069b2016-04-05 13:48:15 -06002060 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002061 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002062 }
2063}
2064
Chia-I Wu01ca2372016-05-13 14:37:49 +08002065VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002066 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002067 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002068 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002069 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002070
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002071 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002072
Dustin Graves080069b2016-04-05 13:48:15 -06002073 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2075
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002076 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002077 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002078
2079 return result;
2080}
2081
Chia-I Wu01ca2372016-05-13 14:37:49 +08002082VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002083 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2084 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002085 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2086 assert(my_data != NULL);
2087
Dustin Graves20fd66f2016-04-18 18:33:21 -06002088 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002089
Dustin Graves20fd66f2016-04-18 18:33:21 -06002090 if (!skipCall) {
2091 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2092
2093 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2094 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002095
2096 return result;
2097}
2098
Chia-I Wu01ca2372016-05-13 14:37:49 +08002099VKAPI_ATTR VkResult VKAPI_CALL
2100WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002101 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002102 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002103 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002104 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002105
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002106 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002107
Dustin Graves080069b2016-04-05 13:48:15 -06002108 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002109 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2110
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002111 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002112 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002113
2114 return result;
2115}
2116
Chia-I Wu01ca2372016-05-13 14:37:49 +08002117VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002118 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2119 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002120 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002121 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002122 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002123
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002124 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002125
Dustin Graves080069b2016-04-05 13:48:15 -06002126 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002127 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2128
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002129 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002130 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002131
2132 return result;
2133}
2134
Chia-I Wu01ca2372016-05-13 14:37:49 +08002135VKAPI_ATTR void VKAPI_CALL
2136DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002137 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002138 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002139 assert(my_data != NULL);
2140
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002141 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002142
Dustin Graves080069b2016-04-05 13:48:15 -06002143 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002144 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002145 }
2146}
2147
Chia-I Wu01ca2372016-05-13 14:37:49 +08002148VKAPI_ATTR VkResult VKAPI_CALL
2149CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002150 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002151 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002152 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002153 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002154
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002155 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002156
Dustin Graves080069b2016-04-05 13:48:15 -06002157 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002158 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2159
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002160 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002162
2163 return result;
2164}
2165
Chia-I Wu01ca2372016-05-13 14:37:49 +08002166VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002167 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002168 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002169 assert(my_data != NULL);
2170
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002171 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002172
Dustin Graves080069b2016-04-05 13:48:15 -06002173 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002174 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002175 }
2176}
2177
Chia-I Wu01ca2372016-05-13 14:37:49 +08002178VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002179 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2180 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002181 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2182 assert(my_data != NULL);
2183
Dustin Graves20fd66f2016-04-18 18:33:21 -06002184 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002185
Dustin Graves20fd66f2016-04-18 18:33:21 -06002186 if (!skipCall) {
2187 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2188
2189 validate_result(my_data->report_data, "vkGetEventStatus", result);
2190 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002191
2192 return result;
2193}
2194
Chia-I Wu01ca2372016-05-13 14:37:49 +08002195VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002196 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2197 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002198 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2199 assert(my_data != NULL);
2200
Dustin Graves20fd66f2016-04-18 18:33:21 -06002201 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002202
Dustin Graves20fd66f2016-04-18 18:33:21 -06002203 if (!skipCall) {
2204 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2205
2206 validate_result(my_data->report_data, "vkSetEvent", result);
2207 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002208
2209 return result;
2210}
2211
Chia-I Wu01ca2372016-05-13 14:37:49 +08002212VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002213 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2214 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002215 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2216 assert(my_data != NULL);
2217
Dustin Graves20fd66f2016-04-18 18:33:21 -06002218 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002219
Dustin Graves20fd66f2016-04-18 18:33:21 -06002220 if (!skipCall) {
2221 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2222
2223 validate_result(my_data->report_data, "vkResetEvent", result);
2224 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002225
2226 return result;
2227}
2228
Chia-I Wu01ca2372016-05-13 14:37:49 +08002229VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2230 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002231 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002232 bool skip_call = false;
2233 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2234 assert(device_data != nullptr);
2235 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002236
Dustin Gravesc900f572016-05-16 11:07:59 -06002237 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002238
Dustin Gravesc900f572016-05-16 11:07:59 -06002239 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2240 if (pCreateInfo != nullptr) {
2241 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2242 // VkQueryPipelineStatisticFlagBits values
2243 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2244 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2245 skip_call |=
2246 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2247 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2248 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2249 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2250 }
2251 }
2252
2253 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002254 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2255
Dustin Gravesc900f572016-05-16 11:07:59 -06002256 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002257 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002258
2259 return result;
2260}
2261
Chia-I Wu01ca2372016-05-13 14:37:49 +08002262VKAPI_ATTR void VKAPI_CALL
2263DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002264 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002265 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002266 assert(my_data != NULL);
2267
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002268 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002269
Dustin Graves080069b2016-04-05 13:48:15 -06002270 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002271 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002272 }
2273}
2274
Chia-I Wu01ca2372016-05-13 14:37:49 +08002275VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2276 uint32_t queryCount, size_t dataSize, void *pData,
2277 VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002278 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002279 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002280 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002281 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002282
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002283 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002284 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002285
Dustin Graves080069b2016-04-05 13:48:15 -06002286 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002287 result = get_dispatch_table(pc_device_table_map, device)
2288 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002289
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002290 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002292
2293 return result;
2294}
2295
Chia-I Wu01ca2372016-05-13 14:37:49 +08002296VKAPI_ATTR VkResult VKAPI_CALL
2297CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002298 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002299 bool skip_call = false;
2300 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2301 assert(device_data != nullptr);
2302 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002303
Dustin Gravesc900f572016-05-16 11:07:59 -06002304 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002305
Dustin Gravesc900f572016-05-16 11:07:59 -06002306 if (pCreateInfo != nullptr) {
2307 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2308 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2309 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2310 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2311 skip_call |=
2312 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2313 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2314 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2315 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316
Dustin Gravesc900f572016-05-16 11:07:59 -06002317 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2318 // queueFamilyIndexCount uint32_t values
2319 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2320 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2321 __LINE__, REQUIRED_PARAMETER, LayerName,
2322 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2323 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2324 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2325 }
2326
2327 // Ensure that the queue family indices were specified at device creation
2328 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2329 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2330 }
2331 }
2332
2333 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002334 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2335
Dustin Gravesc900f572016-05-16 11:07:59 -06002336 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002337 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002338
2339 return result;
2340}
2341
Chia-I Wu01ca2372016-05-13 14:37:49 +08002342VKAPI_ATTR void VKAPI_CALL
2343DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002344 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002345 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002346 assert(my_data != NULL);
2347
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002348 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002349
Dustin Graves080069b2016-04-05 13:48:15 -06002350 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002351 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002352 }
2353}
2354
Chia-I Wu01ca2372016-05-13 14:37:49 +08002355VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2356 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002357 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002358 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002359 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002360 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002361
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002362 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002363
Dustin Graves080069b2016-04-05 13:48:15 -06002364 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002365 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2366
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002367 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002368 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002369
2370 return result;
2371}
2372
Chia-I Wu01ca2372016-05-13 14:37:49 +08002373VKAPI_ATTR void VKAPI_CALL
2374DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002375 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002376 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002377 assert(my_data != NULL);
2378
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002379 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002380
Dustin Graves080069b2016-04-05 13:48:15 -06002381 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002382 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002383 }
2384}
2385
Chia-I Wu01ca2372016-05-13 14:37:49 +08002386VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2387 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002388 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2389 bool skip_call = false;
2390 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002391 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002392 debug_report_data *report_data = device_data->report_data;
2393
2394 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2395
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002396 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002397 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002398 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002399 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2400 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2401 skip_call |=
2402 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2403 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2404 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2405 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002406
Dustin Gravesc900f572016-05-16 11:07:59 -06002407 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2408 // queueFamilyIndexCount uint32_t values
2409 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2410 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2411 __LINE__, REQUIRED_PARAMETER, LayerName,
2412 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2413 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2414 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2415 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002416
2417 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2418 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2419 }
2420
2421 // width, height, and depth members of extent must be greater than 0
2422 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2423 0u);
2424 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2425 0u);
2426 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2427 0u);
2428
2429 // mipLevels must be greater than 0
2430 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2431 0u);
2432
2433 // arrayLayers must be greater than 0
2434 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2435 0u);
2436
2437 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2438 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2439 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2440 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2441 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
2442 }
2443
2444 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2445 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2446 // extent.height must be equal
2447 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2448 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2449 skip_call |=
2450 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2451 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2452 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2453 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
2454 }
2455
2456 if (pCreateInfo->extent.depth != 1) {
2457 skip_call |=
2458 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2459 LayerName,
2460 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2461 }
2462 }
2463
2464 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2465 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2466 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2467 skip_call |= log_msg(
2468 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2469 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2470 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2471 }
2472
2473 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2474 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2475 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2476 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2477 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2478 LayerName,
2479 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2480 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002481 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002482 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002483
Dustin Gravesf8032f22016-05-11 18:31:44 -06002484 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002485 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2486
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002488 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002489
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002490 return result;
2491}
2492
Chia-I Wu01ca2372016-05-13 14:37:49 +08002493VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002494 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002495 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002496 assert(my_data != NULL);
2497
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002498 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002499
Dustin Graves080069b2016-04-05 13:48:15 -06002500 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002501 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002502 }
2503}
2504
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002505bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2506 if (pSubresource != nullptr) {
2507 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2508 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002509 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2510 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002511 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2512 return false;
2513 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002514 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002515
2516 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002517}
2518
Chia-I Wu01ca2372016-05-13 14:37:49 +08002519VKAPI_ATTR void VKAPI_CALL
2520GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002521 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002522 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002523 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002524
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002525 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002526
Dustin Graves080069b2016-04-05 13:48:15 -06002527 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002528 PreGetImageSubresourceLayout(device, pSubresource);
2529
2530 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002531 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002532}
2533
Chia-I Wu01ca2372016-05-13 14:37:49 +08002534VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2535 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002536 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002537 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002539 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002540 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002541
Dustin Graves0b70a632016-04-27 17:44:56 -06002542 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002543
Dustin Graves0b70a632016-04-27 17:44:56 -06002544 if (pCreateInfo != nullptr) {
2545 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2546 if (pCreateInfo->subresourceRange.layerCount != 1) {
2547 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2548 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2549 "pCreateInfo->subresourceRange.layerCount must be 1",
2550 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2551 }
2552 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2553 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)) {
2554 if (pCreateInfo->subresourceRange.layerCount < 1) {
2555 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2556 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2557 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2558 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2559 }
2560 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2561 if (pCreateInfo->subresourceRange.layerCount != 6) {
2562 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2563 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2564 "pCreateInfo->subresourceRange.layerCount must be 6");
2565 }
2566 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2567 if ((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) {
2568 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2569 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2570 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2571 }
2572 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2573 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2574 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2575 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2576 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2577 }
2578
2579 if (pCreateInfo->subresourceRange.layerCount != 1) {
2580 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2581 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2582 "pCreateInfo->subresourceRange.layerCount must be 1");
2583 }
2584 }
2585 }
2586
2587 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002588 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2589
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002590 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002591 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002592
2593 return result;
2594}
2595
Chia-I Wu01ca2372016-05-13 14:37:49 +08002596VKAPI_ATTR void VKAPI_CALL
2597DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002598 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002599 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002600 assert(my_data != NULL);
2601
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002602 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002603
Dustin Graves080069b2016-04-05 13:48:15 -06002604 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002605 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002606 }
2607}
2608
Chia-I Wu01ca2372016-05-13 14:37:49 +08002609VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2610 const VkAllocationCallbacks *pAllocator,
2611 VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002612 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002613 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002614 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002615 assert(my_data != NULL);
2616
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002617 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002618
Dustin Graves080069b2016-04-05 13:48:15 -06002619 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002620 result =
2621 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002622
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002623 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002624 }
2625
Michael Lentine03d8e572015-09-15 14:59:14 -05002626 return result;
2627}
2628
Chia-I Wu01ca2372016-05-13 14:37:49 +08002629VKAPI_ATTR void VKAPI_CALL
2630DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002631 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002632 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002633 assert(my_data != NULL);
2634
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002635 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002636
Dustin Graves080069b2016-04-05 13:48:15 -06002637 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002638 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002639 }
2640}
2641
Chia-I Wu01ca2372016-05-13 14:37:49 +08002642VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2643 const VkAllocationCallbacks *pAllocator,
2644 VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002645 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002646 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002647 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002648 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002649
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002650 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002651
Dustin Graves080069b2016-04-05 13:48:15 -06002652 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002653 result =
2654 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002655
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002656 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002657 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002658
2659 return result;
2660}
2661
Chia-I Wu01ca2372016-05-13 14:37:49 +08002662VKAPI_ATTR void VKAPI_CALL
2663DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002664 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002665 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002666 assert(my_data != NULL);
2667
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002668 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002669
Dustin Graves080069b2016-04-05 13:48:15 -06002670 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002671 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002672 }
2673}
2674
Chia-I Wu01ca2372016-05-13 14:37:49 +08002675VKAPI_ATTR VkResult VKAPI_CALL
2676GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002677 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002678 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002679 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002680 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002681
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002682 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002683
Dustin Graves080069b2016-04-05 13:48:15 -06002684 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002685 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2686
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002687 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002688 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002689
2690 return result;
2691}
2692
Chia-I Wu01ca2372016-05-13 14:37:49 +08002693VKAPI_ATTR VkResult VKAPI_CALL
2694MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002695 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002696 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002697 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002698 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002699
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002700 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002701
Dustin Graves080069b2016-04-05 13:48:15 -06002702 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002703 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2704
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002705 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002706 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002707
2708 return result;
2709}
2710
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002711bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002712 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2713
2714 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002715 if (pCreateInfos != nullptr) {
2716 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2717 if (pCreateInfos->basePipelineIndex != -1) {
2718 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002719 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2720 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002721 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2722 "pCreateInfos->flags "
2723 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2724 return false;
2725 }
2726 }
2727
2728 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2729 if (pCreateInfos->basePipelineIndex != -1) {
2730 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002731 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2732 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002733 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2734 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2735 "VK_NULL_HANDLE");
2736 return false;
2737 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002738 }
2739 }
2740
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002741 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002742 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002743 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2744 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002745 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2746 "unrecognized enumerator");
2747 return false;
2748 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002749 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002750
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002751 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002752 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002753 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002754 pCreateInfos[i].pStages[j].pName);
2755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002756 }
2757
2758 return true;
2759}
2760
Chia-I Wu01ca2372016-05-13 14:37:49 +08002761VKAPI_ATTR VkResult VKAPI_CALL
2762CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2763 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2764 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002765 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002766 bool skip_call = false;
2767 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2768 assert(device_data != nullptr);
2769 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002770
Dustin Gravesc900f572016-05-16 11:07:59 -06002771 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2772 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002773
Dustin Gravesc900f572016-05-16 11:07:59 -06002774 if (pCreateInfos != nullptr) {
2775 for (uint32_t i = 0; i < createInfoCount; ++i) {
2776 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2777 if (pCreateInfos[i].pTessellationState == nullptr) {
2778 if (pCreateInfos[i].pStages != nullptr) {
2779 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2780 // pTessellationState must not be NULL
2781 bool has_control = false;
2782 bool has_eval = false;
2783
2784 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2785 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2786 has_control = true;
2787 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2788 has_eval = true;
2789 }
2790 }
2791
2792 if (has_control && has_eval) {
2793 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2794 __LINE__, REQUIRED_PARAMETER, LayerName,
2795 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2796 "control shader stage and a tessellation evaluation shader stage, "
2797 "pCreateInfos[%d].pTessellationState must not be NULL",
2798 i, i);
2799 }
2800 }
Dustin Graves629259b2016-05-30 16:14:27 -06002801 } else {
2802 skip_call |=
2803 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
2804 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL);
2805
2806 skip_call |=
2807 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2808 pCreateInfos[i].pTessellationState->flags);
2809
2810 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2811 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2812 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2813 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2814 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2815 i);
2816 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002817 }
2818
2819 if (pCreateInfos[i].pViewportState == nullptr) {
2820 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2821 // valid VkPipelineViewportStateCreateInfo structure
2822 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2823 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2824 skip_call |= log_msg(
2825 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2826 REQUIRED_PARAMETER, LayerName,
2827 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2828 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2829 i, i);
2830 }
2831 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002832 skip_call |=
2833 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
2834 pCreateInfos[i].pViewportState->pNext, 0, NULL);
2835
2836 skip_call |=
2837 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2838 pCreateInfos[i].pViewportState->flags);
2839
Dustin Gravesc900f572016-05-16 11:07:59 -06002840 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2841 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2842 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2843 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2844 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2845 i);
2846 }
2847
2848 if (pCreateInfos[i].pDynamicState != nullptr) {
2849 bool has_dynamic_viewport = false;
2850 bool has_dynamic_scissor = false;
2851
2852 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2853 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2854 has_dynamic_viewport = true;
2855 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2856 has_dynamic_scissor = true;
2857 }
2858 }
2859
2860 // viewportCount must be greater than 0
2861 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2862 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2863 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2864 __LINE__, REQUIRED_PARAMETER, LayerName,
2865 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2866 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2867 "must be greater than 0",
2868 i, i);
2869 }
2870
2871 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2872 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2873 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2874 skip_call |=
2875 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2876 __LINE__, REQUIRED_PARAMETER, LayerName,
2877 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2878 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2879 i, i);
2880 }
2881
2882 // scissorCount must be greater than 0
2883 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2884 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2885 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2886 __LINE__, REQUIRED_PARAMETER, LayerName,
2887 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2888 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2889 "must be greater than 0",
2890 i, i);
2891 }
2892
2893 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2894 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2895 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2896 skip_call |=
2897 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2898 __LINE__, REQUIRED_PARAMETER, LayerName,
2899 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2900 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2901 i, i);
2902 }
2903 }
2904 }
2905
2906 if (pCreateInfos[i].pMultisampleState == nullptr) {
2907 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2908 // a valid VkPipelineMultisampleStateCreateInfo structure
2909 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2910 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2911 skip_call |=
2912 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2913 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2914 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2915 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2916 i, i);
2917 }
Dustin Graves629259b2016-05-30 16:14:27 -06002918 } else {
2919 skip_call |=
2920 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
2921 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL);
2922
2923 skip_call |=
2924 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2925 pCreateInfos[i].pMultisampleState->flags);
2926
2927 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2928 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2929 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2930
2931 skip_call |= validate_array(
2932 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2933 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2934 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2935
2936 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2937 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2938 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2939
2940 skip_call |=
2941 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2942 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
2943
2944 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2945 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2946 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2947 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2948 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2949 i);
2950 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002951 }
2952
2953 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06002954 if (pCreateInfos[i].pDepthStencilState != nullptr) {
2955 skip_call |=
2956 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
2957 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL);
2958
2959 skip_call |=
2960 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
2961 pCreateInfos[i].pDepthStencilState->flags);
2962
2963 skip_call |=
2964 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
2965 pCreateInfos[i].pDepthStencilState->depthTestEnable);
2966
2967 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2968 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
2969 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
2970
2971 skip_call |= validate_ranged_enum(
2972 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
2973 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
2974
2975 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2976 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
2977 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
2978
2979 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2980 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
2981 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
2982
2983 skip_call |= validate_ranged_enum(
2984 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
2985 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
2986
2987 skip_call |= validate_ranged_enum(
2988 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
2989 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
2990
2991 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
2992 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
2993 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
2994 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
2995
2996 skip_call |= validate_ranged_enum(
2997 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
2998 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
2999
3000 skip_call |= validate_ranged_enum(
3001 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
3002 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3003
3004 skip_call |= validate_ranged_enum(
3005 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
3006 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3007
3008 skip_call |= validate_ranged_enum(
3009 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
3010 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3011
3012 skip_call |= validate_ranged_enum(
3013 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3014 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3015
3016 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3017 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3018 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3019 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3020 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3021 i);
3022 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003023 }
3024
3025 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3026 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003027 skip_call |=
3028 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
3029 pCreateInfos[i].pColorBlendState->pNext, 0, NULL);
3030
3031 skip_call |=
3032 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3033 pCreateInfos[i].pColorBlendState->flags);
3034
3035 skip_call |=
3036 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3037 pCreateInfos[i].pColorBlendState->logicOpEnable);
3038
3039 skip_call |= validate_array(
3040 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3041 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3042 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3043
3044 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3045 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3046 ++attachmentIndex) {
3047 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3048 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3049 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3050
3051 skip_call |= validate_ranged_enum(
3052 report_data, "vkCreateGraphicsPipelines",
3053 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3054 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3055 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3056
3057 skip_call |= validate_ranged_enum(
3058 report_data, "vkCreateGraphicsPipelines",
3059 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3060 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3061 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3062
3063 skip_call |= validate_ranged_enum(
3064 report_data, "vkCreateGraphicsPipelines",
3065 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3066 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3067
3068 skip_call |= validate_ranged_enum(
3069 report_data, "vkCreateGraphicsPipelines",
3070 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3071 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3072 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3073
3074 skip_call |= validate_ranged_enum(
3075 report_data, "vkCreateGraphicsPipelines",
3076 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3077 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3078 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3079
3080 skip_call |= validate_ranged_enum(
3081 report_data, "vkCreateGraphicsPipelines",
3082 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3083 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3084
3085 skip_call |=
3086 validate_flags(report_data, "vkCreateGraphicsPipelines",
3087 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3088 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3089 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3090 }
3091 }
3092
Dustin Gravesc900f572016-05-16 11:07:59 -06003093 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3094 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3095 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3096 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3097 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3098 i);
3099 }
3100
3101 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3102 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3103 skip_call |= validate_ranged_enum(
3104 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3105 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3106 }
3107 }
3108 }
3109 }
3110
3111 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003112 PreCreateGraphicsPipelines(device, pCreateInfos);
3113
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003114 result = get_dispatch_table(pc_device_table_map, device)
3115 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003116
Dustin Gravesc900f572016-05-16 11:07:59 -06003117 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003118 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003119
3120 return result;
3121}
3122
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003123bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003124 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3125
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003126 if (pCreateInfos != nullptr) {
3127 // TODO: Handle count!
3128 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003129 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003130 }
3131
3132 return true;
3133}
3134
Chia-I Wu01ca2372016-05-13 14:37:49 +08003135VKAPI_ATTR VkResult VKAPI_CALL
3136CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3137 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3138 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003139 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003140 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003141 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003142 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003143
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003144 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003145 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003146
Dustin Graves080069b2016-04-05 13:48:15 -06003147 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003148 PreCreateComputePipelines(device, pCreateInfos);
3149
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003150 result = get_dispatch_table(pc_device_table_map, device)
3151 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003152
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003153 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003154 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003155
3156 return result;
3157}
3158
Chia-I Wu01ca2372016-05-13 14:37:49 +08003159VKAPI_ATTR void VKAPI_CALL
3160DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003161 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003162 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003163 assert(my_data != NULL);
3164
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003165 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003166
Dustin Graves080069b2016-04-05 13:48:15 -06003167 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003168 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003169 }
3170}
3171
Chia-I Wu01ca2372016-05-13 14:37:49 +08003172VKAPI_ATTR VkResult VKAPI_CALL
3173CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3174 VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003175 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003176 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003177 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003178 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003179
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003180 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003181
Dustin Graves080069b2016-04-05 13:48:15 -06003182 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003183 result =
3184 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003185
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003186 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003187 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003188
3189 return result;
3190}
3191
Chia-I Wu01ca2372016-05-13 14:37:49 +08003192VKAPI_ATTR void VKAPI_CALL
3193DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003194 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003195 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003196 assert(my_data != NULL);
3197
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003198 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003199
Dustin Graves080069b2016-04-05 13:48:15 -06003200 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003201 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003202 }
3203}
3204
Chia-I Wu01ca2372016-05-13 14:37:49 +08003205VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3206 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003207 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003208 bool skip_call = false;
3209 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3210 assert(device_data != NULL);
3211 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003212
Dustin Gravesc900f572016-05-16 11:07:59 -06003213 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003214
Dustin Gravesc900f572016-05-16 11:07:59 -06003215 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3216 if (pCreateInfo != nullptr) {
3217 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3218 if (pCreateInfo->compareEnable == VK_TRUE) {
3219 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3220 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3221 }
3222
3223 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3224 // valid VkBorderColor value
3225 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3226 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3227 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3228 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3229 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3230 }
3231 }
3232
3233 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003234 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3235
Dustin Gravesc900f572016-05-16 11:07:59 -06003236 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003237 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003238
3239 return result;
3240}
3241
Chia-I Wu01ca2372016-05-13 14:37:49 +08003242VKAPI_ATTR void VKAPI_CALL
3243DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003244 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003245 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003246 assert(my_data != NULL);
3247
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003248 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003249
Dustin Graves080069b2016-04-05 13:48:15 -06003250 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003252 }
3253}
3254
Chia-I Wu01ca2372016-05-13 14:37:49 +08003255VKAPI_ATTR VkResult VKAPI_CALL
3256CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3257 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003258 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003259 bool skip_call = false;
3260 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3261 assert(device_data != nullptr);
3262 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003263
Dustin Gravesc900f572016-05-16 11:07:59 -06003264 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003265
Dustin Gravesc900f572016-05-16 11:07:59 -06003266 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3267 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3268 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3269 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3270 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3271 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3272 // valid VkSampler handles
3273 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3274 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3275 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3276 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3277 ++descriptor_index) {
3278 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3279 skip_call |=
3280 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3281 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3282 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3283 " specified as VK_NULL_HANDLE",
3284 i, descriptor_index);
3285 }
3286 }
3287 }
3288
3289 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3290 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3291 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3292 skip_call |=
3293 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3294 UNRECOGNIZED_VALUE, LayerName,
3295 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3296 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3297 i, i);
3298 }
3299 }
3300 }
3301 }
3302
3303 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003304 result =
3305 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003306
Dustin Gravesc900f572016-05-16 11:07:59 -06003307 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003308 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003309
3310 return result;
3311}
3312
Chia-I Wu01ca2372016-05-13 14:37:49 +08003313VKAPI_ATTR void VKAPI_CALL
3314DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003315 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003316 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003317 assert(my_data != NULL);
3318
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003319 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003320
Dustin Graves080069b2016-04-05 13:48:15 -06003321 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003322 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003323 }
3324}
3325
Chia-I Wu01ca2372016-05-13 14:37:49 +08003326VKAPI_ATTR VkResult VKAPI_CALL
3327CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3328 VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003329 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003330 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003331 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003332 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003333
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003334 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003335
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003336 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3337
Dustin Graves080069b2016-04-05 13:48:15 -06003338 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003339 result =
3340 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003341
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003342 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003343 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003344
3345 return result;
3346}
3347
Chia-I Wu01ca2372016-05-13 14:37:49 +08003348VKAPI_ATTR void VKAPI_CALL
3349DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003350 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003351 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003352 assert(my_data != NULL);
3353
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003354 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003355
Dustin Graves080069b2016-04-05 13:48:15 -06003356 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003357 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003358 }
3359}
3360
Chia-I Wu01ca2372016-05-13 14:37:49 +08003361VKAPI_ATTR VkResult VKAPI_CALL
3362ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003363 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3364 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3366 assert(my_data != NULL);
3367
Dustin Graves20fd66f2016-04-18 18:33:21 -06003368 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003369
Dustin Graves20fd66f2016-04-18 18:33:21 -06003370 if (!skipCall) {
3371 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3372
3373 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3374 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003375
3376 return result;
3377}
3378
Chia-I Wu01ca2372016-05-13 14:37:49 +08003379VKAPI_ATTR VkResult VKAPI_CALL
3380AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003381 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003382 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003383 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003384 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003385
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003386 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003387
Dustin Graves080069b2016-04-05 13:48:15 -06003388 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003389 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3390
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003391 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003392 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003393
3394 return result;
3395}
3396
Chia-I Wu01ca2372016-05-13 14:37:49 +08003397VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3398 uint32_t descriptorSetCount,
3399 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003400 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003401 bool skip_call = false;
3402 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3403 assert(device_data != nullptr);
3404 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003405
Dustin Gravesc900f572016-05-16 11:07:59 -06003406 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003407
Dustin Gravesc900f572016-05-16 11:07:59 -06003408 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3409 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3410 // validate_array()
3411 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3412 pDescriptorSets, true, true);
3413
3414 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003415 result = get_dispatch_table(pc_device_table_map, device)
3416 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003417
Dustin Gravesc900f572016-05-16 11:07:59 -06003418 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003419 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003420
3421 return result;
3422}
3423
Chia-I Wu01ca2372016-05-13 14:37:49 +08003424VKAPI_ATTR void VKAPI_CALL
3425UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3426 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003427 bool skip_call = false;
3428 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3429 assert(device_data != NULL);
3430 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003431
Dustin Gravesc900f572016-05-16 11:07:59 -06003432 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3433 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003434
Dustin Gravesc900f572016-05-16 11:07:59 -06003435 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3436 if (pDescriptorWrites != NULL) {
3437 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3438 // descriptorCount must be greater than 0
3439 if (pDescriptorWrites[i].descriptorCount == 0) {
3440 skip_call |=
3441 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3442 REQUIRED_PARAMETER, LayerName,
3443 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3444 }
3445
3446 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3447 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3448 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3449 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3450 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3451 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3452 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3453 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3454 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3455 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3456 __LINE__, REQUIRED_PARAMETER, LayerName,
3457 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3458 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3459 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3460 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3461 i, i);
3462 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3463 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3464 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3465 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3466 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3467 ++descriptor_index) {
3468 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3469 "pDescriptorWrites[i].pImageInfo[i].imageView",
3470 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3471 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3472 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3473 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3474 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3475 }
3476 }
3477 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3478 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3479 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3480 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3481 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3482 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3483 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3484 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3485 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3486 __LINE__, REQUIRED_PARAMETER, LayerName,
3487 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3488 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3489 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3490 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3491 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003492 } else {
3493 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3494 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3495 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3496 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3497 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003498 }
3499 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3500 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3501 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3502 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3503 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3504 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3505 __LINE__, REQUIRED_PARAMETER, LayerName,
3506 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3507 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3508 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3509 i, i);
3510 } else {
3511 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3512 ++descriptor_index) {
3513 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3514 "pDescriptorWrites[i].pTexelBufferView[i]",
3515 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3516 }
3517 }
3518 }
3519 }
3520 }
3521
3522 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003523 get_dispatch_table(pc_device_table_map, device)
3524 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003525 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003526}
3527
Chia-I Wu01ca2372016-05-13 14:37:49 +08003528VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3529 const VkAllocationCallbacks *pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003530 VkFramebuffer *pFramebuffer) {
3531 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003532 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003533 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003534 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003535
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003536 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003537
Dustin Graves080069b2016-04-05 13:48:15 -06003538 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003539 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3540
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003541 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003542 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003543
3544 return result;
3545}
3546
Chia-I Wu01ca2372016-05-13 14:37:49 +08003547VKAPI_ATTR void VKAPI_CALL
3548DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003549 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003550 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003551 assert(my_data != NULL);
3552
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003553 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003554
Dustin Graves080069b2016-04-05 13:48:15 -06003555 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003556 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003557 }
3558}
3559
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003560bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3561 bool skip_call = false;
3562 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3563
3564 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3565 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3566 skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3567 __LINE__, DEVICE_LIMIT, "DL",
3568 "Cannot create a render pass with %d color attachments. Max is %d.",
3569 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3570 }
3571 }
3572 return skip_call;
3573}
3574
Chia-I Wu01ca2372016-05-13 14:37:49 +08003575VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3576 const VkAllocationCallbacks *pAllocator,
3577 VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003578 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003579 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003580 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003581 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003582
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003583 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003584 skipCall |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003585
Dustin Graves080069b2016-04-05 13:48:15 -06003586 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003587 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3588
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003589 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003590 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003591
3592 return result;
3593}
3594
Chia-I Wu01ca2372016-05-13 14:37:49 +08003595VKAPI_ATTR void VKAPI_CALL
3596DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003597 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003598 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003599 assert(my_data != NULL);
3600
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003601 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003602
Dustin Graves080069b2016-04-05 13:48:15 -06003603 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003604 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003605 }
3606}
3607
Chia-I Wu01ca2372016-05-13 14:37:49 +08003608VKAPI_ATTR void VKAPI_CALL
3609GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
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_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003615
Dustin Graves080069b2016-04-05 13:48:15 -06003616 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003617 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003618 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003619}
3620
Chia-I Wu01ca2372016-05-13 14:37:49 +08003621VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3622 const VkAllocationCallbacks *pAllocator,
3623 VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003624 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003625 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003626 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003627 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003628
Dustin Gravesde628532016-04-21 16:30:17 -06003629 skipCall |=
3630 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003631
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003632 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003633
Dustin Graves080069b2016-04-05 13:48:15 -06003634 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003635 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3636
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003637 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003638 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003639
3640 return result;
3641}
3642
Chia-I Wu01ca2372016-05-13 14:37:49 +08003643VKAPI_ATTR void VKAPI_CALL
3644DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003645 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003646 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003647 assert(my_data != NULL);
3648
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003649 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003650
Dustin Graves080069b2016-04-05 13:48:15 -06003651 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003652 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003653 }
3654}
3655
Chia-I Wu01ca2372016-05-13 14:37:49 +08003656VKAPI_ATTR VkResult VKAPI_CALL
3657ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003658 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3659 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003660 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3661 assert(my_data != NULL);
3662
Dustin Graves20fd66f2016-04-18 18:33:21 -06003663 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003664
Dustin Graves20fd66f2016-04-18 18:33:21 -06003665 if (!skipCall) {
3666 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3667
3668 validate_result(my_data->report_data, "vkResetCommandPool", result);
3669 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003670
3671 return result;
3672}
3673
Chia-I Wu01ca2372016-05-13 14:37:49 +08003674VKAPI_ATTR VkResult VKAPI_CALL
3675AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003676 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003677 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003679 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003680
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003681 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003682
Dustin Graves080069b2016-04-05 13:48:15 -06003683 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3685
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003686 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003687 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003688
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003689 return result;
3690}
3691
Chia-I Wu01ca2372016-05-13 14:37:49 +08003692VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3693 uint32_t commandBufferCount,
3694 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003695 bool skip_call = false;
3696 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3697 assert(device_data != nullptr);
3698 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003699
Dustin Gravesc900f572016-05-16 11:07:59 -06003700 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003701
Dustin Gravesc900f572016-05-16 11:07:59 -06003702 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3703 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3704 // validate_array()
3705 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3706 pCommandBuffers, true, true);
3707
3708 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003709 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003710 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003711 }
3712}
3713
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003714bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3715 bool skip_call = false;
3716 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3717 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3718
3719 if (pInfo != NULL) {
3720 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3721 skip_call |=
3722 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
3723 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, "PARAMCHECK",
3724 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3725 "inheritedQueries.");
3726 }
3727
3728 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3729 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3730 skip_call |=
3731 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
3732 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, "PARAMCHECK",
3733 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3734 "valid combination of VkQueryControlFlagBits.",
3735 pInfo->queryFlags);
3736 }
3737 }
3738 return skip_call;
3739}
3740
3741VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003742 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003743 bool skip_call = false;
3744 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3745 assert(device_data != nullptr);
3746 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003747
Dustin Gravesc900f572016-05-16 11:07:59 -06003748 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003749
Dustin Gravesc900f572016-05-16 11:07:59 -06003750 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3751 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3752 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3753 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3754 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3755
3756 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003757 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
3758 pBeginInfo->pInheritanceInfo->pNext, 0, NULL);
3759
3760 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3761 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3762
Dustin Gravesc900f572016-05-16 11:07:59 -06003763 // TODO: This only needs to be validated when the inherited queries feature is enabled
3764 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3765 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3766
3767 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3768 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3769 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3770 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3771 }
3772
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003773 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3774
Dustin Gravesc900f572016-05-16 11:07:59 -06003775 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003776 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3777
Dustin Gravesc900f572016-05-16 11:07:59 -06003778 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003779 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003780
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003781 return result;
3782}
3783
Chia-I Wu01ca2372016-05-13 14:37:49 +08003784VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003785 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3786 assert(my_data != NULL);
3787
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003788 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003789
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003790 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003791
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003792 return result;
3793}
3794
Chia-I Wu01ca2372016-05-13 14:37:49 +08003795VKAPI_ATTR VkResult VKAPI_CALL
3796ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003797 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003798 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3799 assert(my_data != NULL);
3800
Dustin Graves16d18972016-05-09 17:36:57 -06003801 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003802
Dustin Graves16d18972016-05-09 17:36:57 -06003803 if (!skip_call) {
3804 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3805
3806 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3807 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003808
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003809 return result;
3810}
3811
Chia-I Wu01ca2372016-05-13 14:37:49 +08003812VKAPI_ATTR void VKAPI_CALL
3813CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003814 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003815 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3816 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003817
Dustin Graves29148ff2016-03-23 19:44:00 -06003818 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3819
Dustin Graves080069b2016-04-05 13:48:15 -06003820 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003821 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3822 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003823}
3824
Chia-I Wu01ca2372016-05-13 14:37:49 +08003825VKAPI_ATTR void VKAPI_CALL
3826CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003827 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003828 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003829 assert(my_data != NULL);
3830
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003831 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003832
Dustin Graves080069b2016-04-05 13:48:15 -06003833 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003834 get_dispatch_table(pc_device_table_map, commandBuffer)
3835 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003836 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003837}
3838
Chia-I Wu01ca2372016-05-13 14:37:49 +08003839VKAPI_ATTR void VKAPI_CALL
3840CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003841 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003842 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003843 assert(my_data != NULL);
3844
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003845 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003846
Dustin Graves080069b2016-04-05 13:48:15 -06003847 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003848 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3849 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003850}
3851
Chia-I Wu01ca2372016-05-13 14:37:49 +08003852VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003853 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003854}
3855
Chia-I Wu01ca2372016-05-13 14:37:49 +08003856VKAPI_ATTR void VKAPI_CALL
3857CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003858 get_dispatch_table(pc_device_table_map, commandBuffer)
3859 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003860}
3861
Chia-I Wu01ca2372016-05-13 14:37:49 +08003862VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003863 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003864 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003865 assert(my_data != NULL);
3866
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003867 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003868
Dustin Graves080069b2016-04-05 13:48:15 -06003869 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003870 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3871 }
Cody Northrop12365112015-08-17 11:10:49 -06003872}
3873
Chia-I Wu01ca2372016-05-13 14:37:49 +08003874VKAPI_ATTR void VKAPI_CALL
3875CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003876 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003877}
3878
Chia-I Wu01ca2372016-05-13 14:37:49 +08003879VKAPI_ATTR void VKAPI_CALL
3880CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003881 bool skipCall = false;
3882 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3883 assert(my_data != NULL);
3884
3885 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3886
3887 if (!skipCall) {
3888 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3889 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003890}
3891
Chia-I Wu01ca2372016-05-13 14:37:49 +08003892VKAPI_ATTR void VKAPI_CALL
3893CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003894 bool skipCall = false;
3895 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3896 assert(my_data != NULL);
3897
3898 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3899
3900 if (!skipCall) {
3901 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3902 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003903}
3904
Chia-I Wu01ca2372016-05-13 14:37:49 +08003905VKAPI_ATTR void VKAPI_CALL
3906CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003907 bool skipCall = false;
3908 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3909 assert(my_data != NULL);
3910
3911 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3912
3913 if (!skipCall) {
3914 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3915 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003916}
3917
Chia-I Wu01ca2372016-05-13 14:37:49 +08003918VKAPI_ATTR void VKAPI_CALL
3919CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3920 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3921 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003922 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003923 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003924 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003925
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003926 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003927 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003928
Dustin Graves080069b2016-04-05 13:48:15 -06003929 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930 get_dispatch_table(pc_device_table_map, commandBuffer)
3931 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3932 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003933 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003934}
3935
Chia-I Wu01ca2372016-05-13 14:37:49 +08003936VKAPI_ATTR void VKAPI_CALL
3937CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003938 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003939 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3940 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003941
Dustin Graves29148ff2016-03-23 19:44:00 -06003942 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3943
Dustin Graves080069b2016-04-05 13:48:15 -06003944 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003945 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3946 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947}
3948
Chia-I Wu01ca2372016-05-13 14:37:49 +08003949VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3950 uint32_t bindingCount, const VkBuffer *pBuffers,
3951 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003952 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003953 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003954 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003955
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003956 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003957
Dustin Graves080069b2016-04-05 13:48:15 -06003958 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003959 get_dispatch_table(pc_device_table_map, commandBuffer)
3960 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003961 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003962}
3963
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003964bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3965 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003966 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003967 // 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 -07003968 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003969 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3970 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003971 return false;
3972 }
3973
3974 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003975 // 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 -07003976 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003977 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3978 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003979 return false;
3980 }
3981
3982 return true;
3983}
3984
Chia-I Wu01ca2372016-05-13 14:37:49 +08003985VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3986 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003987 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003988
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003989 get_dispatch_table(pc_device_table_map, commandBuffer)
3990 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003991}
3992
Chia-I Wu01ca2372016-05-13 14:37:49 +08003993VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3994 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3995 uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003996 get_dispatch_table(pc_device_table_map, commandBuffer)
3997 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003998}
3999
Chia-I Wu01ca2372016-05-13 14:37:49 +08004000VKAPI_ATTR void VKAPI_CALL
4001CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004002 bool skipCall = false;
4003 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4004 assert(my_data != NULL);
4005
4006 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
4007
4008 if (!skipCall) {
4009 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4010 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004011}
4012
Chia-I Wu01ca2372016-05-13 14:37:49 +08004013VKAPI_ATTR void VKAPI_CALL
4014CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004015 bool skipCall = false;
4016 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4017 assert(my_data != NULL);
4018
4019 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
4020
4021 if (!skipCall) {
4022 get_dispatch_table(pc_device_table_map, commandBuffer)
4023 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4024 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004025}
4026
Chia-I Wu01ca2372016-05-13 14:37:49 +08004027VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004028 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004029}
4030
Chia-I Wu01ca2372016-05-13 14:37:49 +08004031VKAPI_ATTR void VKAPI_CALL
4032CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
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_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
4038
4039 if (!skipCall) {
4040 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4041 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004042}
4043
Chia-I Wu01ca2372016-05-13 14:37:49 +08004044VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4045 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004046 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004047 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004048 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004049
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004050 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004051
Dustin Graves080069b2016-04-05 13:48:15 -06004052 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004053 get_dispatch_table(pc_device_table_map, commandBuffer)
4054 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004055 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004056}
4057
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004058bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4059 if (pRegions != nullptr) {
4060 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4061 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004062 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4063 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004064 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4065 return false;
4066 }
4067 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4068 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004069 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4070 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004071 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4072 return false;
4073 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004074 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004075
4076 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004077}
4078
Chia-I Wu01ca2372016-05-13 14:37:49 +08004079VKAPI_ATTR void VKAPI_CALL
4080CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4081 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004082 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004083 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004084 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004085
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004086 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004087 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004088
Dustin Graves080069b2016-04-05 13:48:15 -06004089 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004090 PreCmdCopyImage(commandBuffer, pRegions);
4091
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004092 get_dispatch_table(pc_device_table_map, commandBuffer)
4093 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004094 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004095}
4096
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004097bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4098 if (pRegions != nullptr) {
4099 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4100 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004101 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4102 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004103 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4104 return false;
4105 }
4106 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4107 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004108 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4109 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004110 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4111 return false;
4112 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004113 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004114
4115 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004116}
4117
Chia-I Wu01ca2372016-05-13 14:37:49 +08004118VKAPI_ATTR void VKAPI_CALL
4119CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4120 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06004121 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004122 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004123 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004124
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004125 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004126 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004127
Dustin Graves080069b2016-04-05 13:48:15 -06004128 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004129 PreCmdBlitImage(commandBuffer, pRegions);
4130
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004131 get_dispatch_table(pc_device_table_map, commandBuffer)
4132 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004133 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004134}
4135
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004136bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4137 if (pRegions != nullptr) {
4138 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4139 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004140 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4141 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004142 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4143 "enumerator");
4144 return false;
4145 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004146 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004147
4148 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004149}
4150
Chia-I Wu01ca2372016-05-13 14:37:49 +08004151VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4152 VkImage dstImage, VkImageLayout dstImageLayout,
4153 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004154 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004155 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004156 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004157
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004158 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004159 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004160
Dustin Graves080069b2016-04-05 13:48:15 -06004161 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004162 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004164 get_dispatch_table(pc_device_table_map, commandBuffer)
4165 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004166 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004167}
4168
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004169bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4170 if (pRegions != nullptr) {
4171 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4172 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004173 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4174 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004175 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4176 "enumerator");
4177 return false;
4178 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004179 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004180
4181 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004182}
4183
Chia-I Wu01ca2372016-05-13 14:37:49 +08004184VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4185 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4186 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004187 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004188 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004189 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004191 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004192 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004193
Dustin Graves080069b2016-04-05 13:48:15 -06004194 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004195 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004197 get_dispatch_table(pc_device_table_map, commandBuffer)
4198 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004199 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004200}
4201
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004202VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4203 VkDeviceSize dataSize, const uint32_t *pData) {
4204 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004205 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004206 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004207
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004208 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004209
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004210 if (dstOffset & 3) {
4211 skip_call |=
4212 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4213 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4",
4214 dstOffset);
4215 }
4216
4217 if ((dataSize <= 0) || (dataSize > 65536)) {
4218 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4219 INVALID_USAGE, "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4220 "), must be greater than zero and less than or equal to 65536",
4221 dataSize);
4222 } else if (dataSize & 3) {
4223 skip_call |=
4224 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4225 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4",
4226 dataSize);
4227 }
4228
4229 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004230 get_dispatch_table(pc_device_table_map, commandBuffer)
4231 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004232 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004233}
4234
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004235VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4236 VkDeviceSize size, uint32_t data) {
4237 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004238 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4239 assert(my_data != NULL);
4240
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004241 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004242
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004243 if (dstOffset & 3) {
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004244 skip_call |=
4245 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4246 "PARAMCHECK", "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4",
4247 dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004248 }
4249
4250 if (size != VK_WHOLE_SIZE) {
4251 if (size <= 0) {
4252 skip_call |= log_msg(
4253 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004254 "PARAMCHECK", "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004255 } else if (size & 3) {
4256 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 -06004257 INVALID_USAGE, "PARAMCHECK",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004258 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4259 }
4260 }
4261
4262 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004263 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4264 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004265}
4266
Chia-I Wu01ca2372016-05-13 14:37:49 +08004267VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4268 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4269 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004270 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004271 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004272 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004273
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004274 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004275
Dustin Graves080069b2016-04-05 13:48:15 -06004276 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004277 get_dispatch_table(pc_device_table_map, commandBuffer)
4278 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004279 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004280}
4281
Chia-I Wu01ca2372016-05-13 14:37:49 +08004282VKAPI_ATTR void VKAPI_CALL
4283CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4284 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4285 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004286 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004287 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004288 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004289
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004290 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004291 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004292
Dustin Graves080069b2016-04-05 13:48:15 -06004293 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 get_dispatch_table(pc_device_table_map, commandBuffer)
4295 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004296 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004297}
4298
Chia-I Wu01ca2372016-05-13 14:37:49 +08004299VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4300 const VkClearAttachment *pAttachments, uint32_t rectCount,
4301 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004302 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004303 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004304 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004305
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004306 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004307
Dustin Graves080069b2016-04-05 13:48:15 -06004308 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004309 get_dispatch_table(pc_device_table_map, commandBuffer)
4310 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004311 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004312}
4313
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004314bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4315 if (pRegions != nullptr) {
4316 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4317 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4318 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004319 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4320 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004321 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4322 return false;
4323 }
4324 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4325 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4326 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004327 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4328 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004329 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4330 return false;
4331 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004332 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004333
4334 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004335}
4336
Chia-I Wu01ca2372016-05-13 14:37:49 +08004337VKAPI_ATTR void VKAPI_CALL
4338CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4339 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004340 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004341 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004342 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004343
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004344 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004345 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004346
Dustin Graves080069b2016-04-05 13:48:15 -06004347 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004348 PreCmdResolveImage(commandBuffer, pRegions);
4349
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004350 get_dispatch_table(pc_device_table_map, commandBuffer)
4351 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004352 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004353}
4354
Chia-I Wu01ca2372016-05-13 14:37:49 +08004355VKAPI_ATTR void VKAPI_CALL
4356CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004357 bool skipCall = false;
4358 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4359 assert(my_data != NULL);
4360
4361 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4362
4363 if (!skipCall) {
4364 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4365 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004366}
4367
Chia-I Wu01ca2372016-05-13 14:37:49 +08004368VKAPI_ATTR void VKAPI_CALL
4369CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004370 bool skipCall = false;
4371 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4372 assert(my_data != NULL);
4373
4374 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4375
4376 if (!skipCall) {
4377 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4378 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004379}
4380
Chia-I Wu01ca2372016-05-13 14:37:49 +08004381VKAPI_ATTR void VKAPI_CALL
4382CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4383 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4384 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4385 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004386 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004387 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004388 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004389
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004390 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004391 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4392 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004393
Dustin Graves080069b2016-04-05 13:48:15 -06004394 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004395 get_dispatch_table(pc_device_table_map, commandBuffer)
4396 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4397 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004398 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004399}
4400
Chia-I Wu01ca2372016-05-13 14:37:49 +08004401VKAPI_ATTR void VKAPI_CALL
4402CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4403 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4404 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4405 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004406 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004407 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004408 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004409
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004410 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004411 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4412 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004413
Dustin Graves080069b2016-04-05 13:48:15 -06004414 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004415 get_dispatch_table(pc_device_table_map, commandBuffer)
4416 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4417 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004418 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004419}
4420
Chia-I Wu01ca2372016-05-13 14:37:49 +08004421VKAPI_ATTR void VKAPI_CALL
4422CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004423 bool skipCall = false;
4424 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4425 assert(my_data != NULL);
4426
4427 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4428
4429 if (!skipCall) {
4430 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4431 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004432}
4433
Chia-I Wu01ca2372016-05-13 14:37:49 +08004434VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004435 bool skipCall = false;
4436 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4437 assert(my_data != NULL);
4438
4439 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4440
4441 if (!skipCall) {
4442 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4443 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004444}
4445
Chia-I Wu01ca2372016-05-13 14:37:49 +08004446VKAPI_ATTR void VKAPI_CALL
4447CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004448 bool skipCall = false;
4449 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4450 assert(my_data != NULL);
4451
4452 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4453
4454 if (!skipCall) {
4455 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4456 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004457}
4458
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004459bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4460 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004461
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004462 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004463
4464 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004465}
4466
Chia-I Wu01ca2372016-05-13 14:37:49 +08004467VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4468 VkQueryPool queryPool, uint32_t query) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004469 bool skipCall = false;
4470 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4471 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004472
Dustin Graves20fd66f2016-04-18 18:33:21 -06004473 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4474
4475 if (!skipCall) {
4476 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4477
4478 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4479 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004480}
4481
Chia-I Wu01ca2372016-05-13 14:37:49 +08004482VKAPI_ATTR void VKAPI_CALL
4483CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4484 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004485 bool skipCall = false;
4486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4487 assert(my_data != NULL);
4488
4489 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4490 dstOffset, stride, flags);
4491
4492 if (!skipCall) {
4493 get_dispatch_table(pc_device_table_map, commandBuffer)
4494 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4495 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004496}
4497
Chia-I Wu01ca2372016-05-13 14:37:49 +08004498VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4499 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4500 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004501 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004502 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004503 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004504
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004505 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004506
Dustin Graves080069b2016-04-05 13:48:15 -06004507 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004508 get_dispatch_table(pc_device_table_map, commandBuffer)
4509 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004510 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004511}
4512
Chia-I Wu01ca2372016-05-13 14:37:49 +08004513VKAPI_ATTR void VKAPI_CALL
4514CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004515 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004516 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004517 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004518
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004519 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004520
Dustin Graves080069b2016-04-05 13:48:15 -06004521 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004522 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004523 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004524}
4525
Chia-I Wu01ca2372016-05-13 14:37:49 +08004526VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004527 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004528 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4529 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004530
Dustin Graves29148ff2016-03-23 19:44:00 -06004531 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4532
Dustin Graves080069b2016-04-05 13:48:15 -06004533 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004534 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4535 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004536}
4537
Chia-I Wu01ca2372016-05-13 14:37:49 +08004538VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004539 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004540}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004541
Chia-I Wu01ca2372016-05-13 14:37:49 +08004542VKAPI_ATTR void VKAPI_CALL
4543CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004544 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004545 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004546 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004547
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004548 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004549
Dustin Graves080069b2016-04-05 13:48:15 -06004550 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004551 get_dispatch_table(pc_device_table_map, commandBuffer)
4552 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004553 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004554}
4555
Chia-I Wub02600c2016-05-20 07:11:22 +08004556VKAPI_ATTR VkResult VKAPI_CALL
4557EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4558 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4559}
4560
4561VKAPI_ATTR VkResult VKAPI_CALL
4562EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
4563 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4564}
4565
4566VKAPI_ATTR VkResult VKAPI_CALL
4567EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
4568 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4569 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4570
4571 return VK_ERROR_LAYER_NOT_PRESENT;
4572}
4573
Chia-I Wu01ca2372016-05-13 14:37:49 +08004574VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4575 const char *pLayerName, uint32_t *pCount,
4576 VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004577 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004578 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004579 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004580
4581 assert(physicalDevice);
4582
4583 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4584 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004585}
4586
Chia-I Wuf9b01382016-05-16 07:37:41 +08004587static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004588intercept_core_instance_command(const char *name);
4589
4590static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004591intercept_core_device_command(const char *name);
4592
Chia-I Wu01ca2372016-05-13 14:37:49 +08004593VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08004594 assert(device);
4595
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004596 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4597
Dustin Graves080069b2016-04-05 13:48:15 -06004598 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004599 return NULL;
4600 }
4601
Chia-I Wuf9b01382016-05-16 07:37:41 +08004602 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
4603 if (proc)
4604 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004605
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004606 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004607 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004608 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004609}
4610
Chia-I Wu01ca2372016-05-13 14:37:49 +08004611VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08004612 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08004613 if (!proc)
4614 proc = intercept_core_device_command(funcName);
Chia-I Wu617f2a42016-05-16 07:41:17 +08004615 if (proc)
4616 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004617
Chia-I Wu617f2a42016-05-16 07:41:17 +08004618 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004619
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004620 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004621
Chia-I Wu617f2a42016-05-16 07:41:17 +08004622 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
4623 if (proc)
4624 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004625
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004626 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004627 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004628 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004629}
Chia-I Wu99f701c2016-05-13 14:06:08 +08004630
Chia-I Wuf9b01382016-05-16 07:37:41 +08004631static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004632intercept_core_instance_command(const char *name) {
4633 static const struct {
4634 const char *name;
4635 PFN_vkVoidFunction proc;
4636 } core_instance_commands[] = {
4637 { "vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr) },
4638 { "vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance) },
4639 { "vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance) },
4640 { "vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice) },
4641 { "vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices) },
4642 { "vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties) },
4643 { "vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures) },
4644 { "vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties) },
4645 { "vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties) },
4646 { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties) },
4647 { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties) },
4648 { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties) },
Chia-I Wub02600c2016-05-20 07:11:22 +08004649 { "vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties) },
4650 { "vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties) },
4651 { "vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08004652 { "vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties) },
4653 };
4654
4655 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
4656 if (!strcmp(core_instance_commands[i].name, name))
4657 return core_instance_commands[i].proc;
4658 }
4659
4660 return nullptr;
4661}
4662
4663static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004664intercept_core_device_command(const char *name) {
4665 static const struct {
4666 const char *name;
4667 PFN_vkVoidFunction proc;
4668 } core_device_commands[] = {
4669 { "vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr) },
4670 { "vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice) },
4671 { "vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue) },
4672 { "vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit) },
4673 { "vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle) },
4674 { "vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle) },
4675 { "vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory) },
4676 { "vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory) },
4677 { "vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory) },
4678 { "vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory) },
4679 { "vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges) },
4680 { "vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges) },
4681 { "vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment) },
4682 { "vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory) },
4683 { "vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory) },
4684 { "vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence) },
4685 { "vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence) },
4686 { "vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences) },
4687 { "vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus) },
4688 { "vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences) },
4689 { "vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore) },
4690 { "vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore) },
4691 { "vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent) },
4692 { "vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent) },
4693 { "vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus) },
4694 { "vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent) },
4695 { "vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent) },
4696 { "vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool) },
4697 { "vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool) },
4698 { "vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults) },
4699 { "vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer) },
4700 { "vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer) },
4701 { "vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView) },
4702 { "vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView) },
4703 { "vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage) },
4704 { "vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage) },
4705 { "vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout) },
4706 { "vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView) },
4707 { "vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView) },
4708 { "vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule) },
4709 { "vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule) },
4710 { "vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache) },
4711 { "vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache) },
4712 { "vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData) },
4713 { "vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches) },
4714 { "vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines) },
4715 { "vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines) },
4716 { "vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline) },
4717 { "vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout) },
4718 { "vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout) },
4719 { "vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler) },
4720 { "vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler) },
4721 { "vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout) },
4722 { "vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout) },
4723 { "vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool) },
4724 { "vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool) },
4725 { "vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool) },
4726 { "vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets) },
4727 { "vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets) },
4728 { "vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets) },
4729 { "vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport) },
4730 { "vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor) },
4731 { "vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth) },
4732 { "vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias) },
4733 { "vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants) },
4734 { "vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds) },
4735 { "vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask) },
4736 { "vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask) },
4737 { "vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference) },
4738 { "vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers) },
4739 { "vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers) },
4740 { "vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer) },
4741 { "vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer) },
4742 { "vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer) },
4743 { "vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline) },
4744 { "vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets) },
4745 { "vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers) },
4746 { "vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer) },
4747 { "vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw) },
4748 { "vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed) },
4749 { "vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect) },
4750 { "vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect) },
4751 { "vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch) },
4752 { "vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect) },
4753 { "vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer) },
4754 { "vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage) },
4755 { "vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage) },
4756 { "vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage) },
4757 { "vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer) },
4758 { "vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer) },
4759 { "vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer) },
4760 { "vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage) },
4761 { "vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage) },
4762 { "vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent) },
4763 { "vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent) },
4764 { "vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents) },
4765 { "vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier) },
4766 { "vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery) },
4767 { "vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery) },
4768 { "vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool) },
4769 { "vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp) },
4770 { "vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults) },
4771 { "vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer) },
4772 { "vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer) },
4773 { "vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass) },
4774 { "vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass) },
4775 { "vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity) },
4776 { "vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool) },
4777 { "vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool) },
4778 { "vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool) },
4779 { "vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass) },
4780 { "vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass) },
4781 };
4782
4783 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
4784 if (!strcmp(core_device_commands[i].name, name))
4785 return core_device_commands[i].proc;
4786 }
4787
4788 return nullptr;
4789}
4790
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004791} // namespace parameter_validation
4792
4793// vk_layer_logging.h expects these to be defined
4794
4795VKAPI_ATTR VkResult VKAPI_CALL
4796vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4797 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004798 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004799}
4800
4801VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
4802 VkDebugReportCallbackEXT msgCallback,
4803 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004804 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004805}
4806
4807VKAPI_ATTR void VKAPI_CALL
4808vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
4809 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004810 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004811}
4812
4813// loader-layer interface v0
4814
Chia-I Wu99f701c2016-05-13 14:06:08 +08004815VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4816vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004817 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004818}
4819
4820VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4821vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004822 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004823}
4824
4825VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4826vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004827 // the layer command handles VK_NULL_HANDLE just fine internally
4828 assert(physicalDevice == VK_NULL_HANDLE);
4829 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004830}
4831
4832VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4833 const char *pLayerName, uint32_t *pCount,
4834 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004835 // the layer command handles VK_NULL_HANDLE just fine internally
4836 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08004837 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004838}
4839
4840VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004841 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004842}
4843
4844VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004845 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004846}