blob: 54882a78cb8d08b166d37d531860e1ae3d50cecc [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,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001239 LayerName, "%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,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001243 LayerName, "%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) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001255 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1256 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001257 } 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,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001261 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1262 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001263 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) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001280 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1281 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001282 } else {
1283 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1284 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1285 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001286 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1287 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001288 function_name, parameter_name, i, indices[i]);
1289 return false;
1290 }
1291 }
1292 }
1293 }
1294
1295 return skip_call;
1296}
1297
Chia-I Wu01ca2372016-05-13 14:37:49 +08001298VKAPI_ATTR VkResult VKAPI_CALL
1299CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001300 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001301
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001302 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001303 assert(chain_info != nullptr);
1304 assert(chain_info->u.pLayerInfo != nullptr);
1305
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001306 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1307 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001308 if (fpCreateInstance == NULL) {
1309 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001310 }
1311
Dustin Graves842621d2016-03-03 14:17:08 -07001312 // Advance the link info for the next element on the chain
1313 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1314
1315 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001316
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001317 if (result == VK_SUCCESS) {
1318 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1319 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001320
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001321 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001322
Chia-I Wua570b7c2016-05-16 07:48:14 +08001323 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001324 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1325 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001326
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001327 // Look for one or more debug report create info structures
1328 // and setup a callback(s) for each one found.
1329 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1330 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1331 if (my_instance_data->num_tmp_callbacks > 0) {
1332 // Setup the temporary callback(s) here to catch early issues:
1333 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1334 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1335 // Failure of setting up one or more of the callback.
1336 // Therefore, clean up and don't use those callbacks:
1337 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1338 my_instance_data->num_tmp_callbacks = 0;
1339 }
1340 }
1341 }
1342
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001343 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001344
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001345 // Ordinarily we'd check these before calling down the chain, but none of the layer
1346 // support is in place until now, if we survive we can report the issue now.
1347 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001349 if (pCreateInfo->pApplicationInfo) {
1350 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1351 validate_string(my_instance_data->report_data, "vkCreateInstance",
1352 "pCreateInfo->VkApplicationInfo->pApplicationName",
1353 pCreateInfo->pApplicationInfo->pApplicationName);
1354 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001355
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001356 if (pCreateInfo->pApplicationInfo->pEngineName) {
1357 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1358 pCreateInfo->pApplicationInfo->pEngineName);
1359 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001360 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001361
1362 // Disable the tmp callbacks:
1363 if (my_instance_data->num_tmp_callbacks > 0) {
1364 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1365 my_instance_data->tmp_callbacks);
1366 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001367 }
1368
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001369 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001370}
1371
Chia-I Wu01ca2372016-05-13 14:37:49 +08001372VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001373 // Grab the key before the instance is destroyed.
1374 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001375 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001376 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001377 assert(my_data != NULL);
1378
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001379 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1380 bool callback_setup = false;
1381 if (my_data->num_tmp_callbacks > 0) {
1382 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1383 my_data->tmp_callbacks)) {
1384 callback_setup = true;
1385 }
1386 }
1387
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001388 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001389
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001390 // Disable and cleanup the temporary callback(s):
1391 if (callback_setup) {
1392 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1393 }
1394 if (my_data->num_tmp_callbacks > 0) {
1395 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1396 my_data->num_tmp_callbacks = 0;
1397 }
1398
Dustin Graves080069b2016-04-05 13:48:15 -06001399 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001400 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001401 pTable->DestroyInstance(instance, pAllocator);
1402
1403 // Clean up logging callback, if any
1404 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001405 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1406 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001407 my_data->logging_callback.pop_back();
1408 }
1409
1410 layer_debug_report_destroy_instance(mid(instance));
1411 layer_data_map.erase(pTable);
1412
1413 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001414 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001415 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001416}
1417
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001418VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1419 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001420 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001421 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001422 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001423 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001424
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001425 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001426
Dustin Graves080069b2016-04-05 13:48:15 -06001427 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001428 result = get_dispatch_table(pc_instance_table_map, instance)
1429 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001430
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001431 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001432 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1433 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1434 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1435 // Save the supported features for each physical device
1436 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1437 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1438 }
1439 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001440 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001441 return result;
1442}
1443
Chia-I Wu01ca2372016-05-13 14:37:49 +08001444VKAPI_ATTR void VKAPI_CALL
1445GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001446 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001447 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001448 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001449
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001450 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001451
Dustin Graves080069b2016-04-05 13:48:15 -06001452 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001455}
1456
Chia-I Wu01ca2372016-05-13 14:37:49 +08001457VKAPI_ATTR void VKAPI_CALL
1458GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001459 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001460 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001461 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001462
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001463 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464
Dustin Graves080069b2016-04-05 13:48:15 -06001465 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001466 get_dispatch_table(pc_instance_table_map, physicalDevice)
1467 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001469}
1470
Chia-I Wu01ca2372016-05-13 14:37:49 +08001471VKAPI_ATTR VkResult VKAPI_CALL
1472GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1473 VkImageUsageFlags usage, VkImageCreateFlags flags,
1474 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001475 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001476 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001477 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001478 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001479
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001480 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001481 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001482
Dustin Graves080069b2016-04-05 13:48:15 -06001483 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001484 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1485 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1486 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001488 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489 }
Chia-I Wu17241042015-10-31 00:31:16 +08001490
1491 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001492}
1493
Chia-I Wu01ca2372016-05-13 14:37:49 +08001494VKAPI_ATTR void VKAPI_CALL
1495GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001496 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001498 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001499
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001500 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501
Dustin Graves080069b2016-04-05 13:48:15 -06001502 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001503 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001505}
1506
Chia-I Wu01ca2372016-05-13 14:37:49 +08001507VKAPI_ATTR void VKAPI_CALL
1508GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1509 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001510 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001511 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001512 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001513
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001514 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001515 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516
Dustin Graves080069b2016-04-05 13:48:15 -06001517 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518 get_dispatch_table(pc_instance_table_map, physicalDevice)
1519 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001520 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001521}
1522
Chia-I Wu01ca2372016-05-13 14:37:49 +08001523VKAPI_ATTR void VKAPI_CALL
1524GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001525 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001526 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001527 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001528
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001529 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001530
Dustin Graves080069b2016-04-05 13:48:15 -06001531 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001532 get_dispatch_table(pc_instance_table_map, physicalDevice)
1533 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001534 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001535}
1536
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001537void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1538 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001539 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001540
1541 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1542 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1543 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001544 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001545 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001546 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1547 "structure.",
1548 i);
1549 } else {
1550 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001551 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001552
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001553 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1554 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1555 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1556 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001557 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001558 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001559 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1560 "between 0 and 1. Actual value is %f",
1561 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1562 }
1563 }
1564 }
1565
1566 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1567 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001568 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001569 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001570 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1571 "of queue families.",
1572 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001573 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1574 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1575 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001576 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001577 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001578 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1579 "queues for the given family index.",
1580 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001581 }
Michael Lentine774704f2016-01-27 13:36:46 -06001582 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001583 }
1584}
1585
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001586void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001587 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001588
1589 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1590 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1591 my_device_data->queueFamilyIndexMap.insert(
1592 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1593 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001594 }
1595}
1596
Chia-I Wu01ca2372016-05-13 14:37:49 +08001597VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice,
1598 const VkDeviceCreateInfo *pCreateInfo,
1599 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001600 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001601 * NOTE: We do not validate physicalDevice or any dispatchable
1602 * object as the first parameter. We couldn't get here if it was wrong!
1603 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001604
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001605 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001606 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001607 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001608 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001609
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001610 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001611
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001612 if (pCreateInfo != NULL) {
1613 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001614 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001615 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1616 pCreateInfo->ppEnabledLayerNames[i]);
1617 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001618 }
Michael Lentine774704f2016-01-27 13:36:46 -06001619
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001620 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001621 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001622 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1623 pCreateInfo->ppEnabledExtensionNames[i]);
1624 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001625 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001626 }
1627
Dustin Graves080069b2016-04-05 13:48:15 -06001628 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001629 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001630 assert(chain_info != nullptr);
1631 assert(chain_info->u.pLayerInfo != nullptr);
1632
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001633 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1634 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001635 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001636 if (fpCreateDevice == NULL) {
1637 return VK_ERROR_INITIALIZATION_FAILED;
1638 }
1639
1640 // Advance the link info for the next element on the chain
1641 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1642
1643 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001644
1645 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1646
1647 if (result == VK_SUCCESS) {
1648 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1649 assert(my_device_data != nullptr);
1650
1651 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1652 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1653
1654 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001655 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1656 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001657 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001658 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001659
1660 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1661 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001662
1663 // Query and save physical device limits for this device
1664 VkPhysicalDeviceProperties device_properties = {};
1665 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1666 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001667 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001668
1669 // Save app-enabled features in this device's layer_data structure
1670 if (pCreateInfo->pEnabledFeatures) {
1671 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1672 } else {
1673 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1674 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001675 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001676 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001677
Jeremy Hayes99a96322015-06-26 12:48:09 -06001678 return result;
1679}
1680
Chia-I Wu01ca2372016-05-13 14:37:49 +08001681VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001682 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001683 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001684 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1685 assert(my_data != NULL);
1686
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001687 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001688
Dustin Graves080069b2016-04-05 13:48:15 -06001689 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001690 layer_debug_report_destroy_device(device);
1691
Jeremy Hayes99a96322015-06-26 12:48:09 -06001692#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001693 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001694#endif
1695
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001696 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001697 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001698 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001699 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001700}
1701
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001702bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001703 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001704 assert(my_device_data != nullptr);
1705
Dustin Gravesde628532016-04-21 16:30:17 -06001706 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001707
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001708 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001709 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001710 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001711 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001712 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1713 "was created.",
1714 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001715 return false;
1716 }
1717 return true;
1718}
1719
Chia-I Wu01ca2372016-05-13 14:37:49 +08001720VKAPI_ATTR void VKAPI_CALL
1721GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001722 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001724 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001725
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001726 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001727
Dustin Graves080069b2016-04-05 13:48:15 -06001728 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001729 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1730
1731 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001732 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001733}
1734
Chia-I Wu01ca2372016-05-13 14:37:49 +08001735VKAPI_ATTR VkResult VKAPI_CALL
1736QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001737 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001738 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001739 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001740 assert(my_data != NULL);
1741
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001742 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001743
Dustin Graves080069b2016-04-05 13:48:15 -06001744 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001745 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1746
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001747 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001748 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001749
Jeremy Hayes99a96322015-06-26 12:48:09 -06001750 return result;
1751}
1752
Chia-I Wu01ca2372016-05-13 14:37:49 +08001753VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001754 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1755 assert(my_data != NULL);
1756
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001757 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001759 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001760
1761 return result;
1762}
1763
Chia-I Wu01ca2372016-05-13 14:37:49 +08001764VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001765 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1766 assert(my_data != NULL);
1767
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001768 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001769
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001770 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001771
1772 return result;
1773}
1774
Chia-I Wu01ca2372016-05-13 14:37:49 +08001775VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001776 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1777 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001778 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001779 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001780 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001781
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001782 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001783
Dustin Graves080069b2016-04-05 13:48:15 -06001784 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001785 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1786
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001787 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001788 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001789
1790 return result;
1791}
1792
Chia-I Wu01ca2372016-05-13 14:37:49 +08001793VKAPI_ATTR void VKAPI_CALL
1794FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001795 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001796 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001797 assert(my_data != NULL);
1798
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001799 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001800
Dustin Graves080069b2016-04-05 13:48:15 -06001801 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001802 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001803 }
1804}
1805
Chia-I Wu01ca2372016-05-13 14:37:49 +08001806VKAPI_ATTR VkResult VKAPI_CALL
1807MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001808 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001809 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001810 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001811 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001812
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001813 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001814
Dustin Graves080069b2016-04-05 13:48:15 -06001815 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001816 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1817
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001818 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001819 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001820
1821 return result;
1822}
1823
Chia-I Wu01ca2372016-05-13 14:37:49 +08001824VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001825 bool skipCall = false;
1826 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1827 assert(my_data != NULL);
1828
1829 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1830
1831 if (!skipCall) {
1832 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1833 }
1834}
1835
Chia-I Wu01ca2372016-05-13 14:37:49 +08001836VKAPI_ATTR VkResult VKAPI_CALL
1837FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001838 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001839 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001840 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001841 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001842
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001843 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001844
Dustin Graves080069b2016-04-05 13:48:15 -06001845 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001846 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1847
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001848 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001849 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001850
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001851 return result;
1852}
1853
Chia-I Wu01ca2372016-05-13 14:37:49 +08001854VKAPI_ATTR VkResult VKAPI_CALL
1855InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001856 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001857 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001858 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001859 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001860
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001861 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001862
Dustin Graves080069b2016-04-05 13:48:15 -06001863 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001864 result =
1865 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001866
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001867 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001868 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001869
Tony Barbourb1250542015-04-16 19:23:13 -06001870 return result;
1871}
1872
Chia-I Wu01ca2372016-05-13 14:37:49 +08001873VKAPI_ATTR void VKAPI_CALL
1874GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001875 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001876 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001878
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001879 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001880
Dustin Graves080069b2016-04-05 13:48:15 -06001881 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001882 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001883 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001884}
1885
Chia-I Wu01ca2372016-05-13 14:37:49 +08001886VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1887 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001888 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1889 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001890 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1891 assert(my_data != NULL);
1892
Dustin Graves20fd66f2016-04-18 18:33:21 -06001893 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001894
Dustin Graves20fd66f2016-04-18 18:33:21 -06001895 if (!skipCall) {
1896 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1897
1898 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1899 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001900
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001901 return result;
1902}
1903
Chia-I Wu01ca2372016-05-13 14:37:49 +08001904VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1905 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001906 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1907 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001908 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1909 assert(my_data != NULL);
1910
Dustin Graves20fd66f2016-04-18 18:33:21 -06001911 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001912
Dustin Graves20fd66f2016-04-18 18:33:21 -06001913 if (!skipCall) {
1914 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1915
1916 validate_result(my_data->report_data, "vkBindImageMemory", result);
1917 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001918
1919 return result;
1920}
1921
Chia-I Wu01ca2372016-05-13 14:37:49 +08001922VKAPI_ATTR void VKAPI_CALL
1923GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001924 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001925 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001926 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001927
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001928 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001929
Dustin Graves080069b2016-04-05 13:48:15 -06001930 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001931 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001932 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001933}
1934
Chia-I Wu01ca2372016-05-13 14:37:49 +08001935VKAPI_ATTR void VKAPI_CALL
1936GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001937 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001938 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001939 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001940
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001941 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001942
Dustin Graves080069b2016-04-05 13:48:15 -06001943 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001944 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001945 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001946}
1947
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001948bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1949 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1950 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001951 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001952 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1953 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001954 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001955 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001956 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1957 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001958 return false;
1959 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001960 }
1961
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001962 return true;
1963}
1964
Chia-I Wu01ca2372016-05-13 14:37:49 +08001965VKAPI_ATTR void VKAPI_CALL
1966GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1967 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001968 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001970 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001971
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001972 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001973 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001974
Dustin Graves080069b2016-04-05 13:48:15 -06001975 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001976 get_dispatch_table(pc_device_table_map, device)
1977 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001978
1979 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1980 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001981}
1982
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001983bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1984 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1985 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986 if (pProperties != nullptr) {
1987 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1988 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001989 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001990 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001991 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1992 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001993 return false;
1994 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001995 }
1996
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001997 return true;
1998}
1999
Chia-I Wu01ca2372016-05-13 14:37:49 +08002000VKAPI_ATTR void VKAPI_CALL
2001GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2002 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2003 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06002004 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002005 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002006 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002007
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002008 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002009 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002010
Dustin Graves080069b2016-04-05 13:48:15 -06002011 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002012 get_dispatch_table(pc_instance_table_map, physicalDevice)
2013 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2014 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002015
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002016 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2017 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002018 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002019}
2020
Chia-I Wu01ca2372016-05-13 14:37:49 +08002021VKAPI_ATTR VkResult VKAPI_CALL
2022QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002023 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002024 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002025 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002026 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002027
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002028 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002029
Dustin Graves080069b2016-04-05 13:48:15 -06002030 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002031 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2032
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002033 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002034 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002035
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002036 return result;
2037}
2038
Chia-I Wu01ca2372016-05-13 14:37:49 +08002039VKAPI_ATTR VkResult VKAPI_CALL
2040CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002041 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002042 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002043 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002044 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002045
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002046 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002047
Dustin Graves080069b2016-04-05 13:48:15 -06002048 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002049 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2050
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002051 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002052 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002053
2054 return result;
2055}
2056
Chia-I Wu01ca2372016-05-13 14:37:49 +08002057VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002058 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002059 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002060 assert(my_data != NULL);
2061
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002062 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002063
Dustin Graves080069b2016-04-05 13:48:15 -06002064 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002065 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002066 }
2067}
2068
Chia-I Wu01ca2372016-05-13 14:37:49 +08002069VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002071 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002073 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002074
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002075 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002076
Dustin Graves080069b2016-04-05 13:48:15 -06002077 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002078 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2079
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002080 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002081 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002082
2083 return result;
2084}
2085
Chia-I Wu01ca2372016-05-13 14:37:49 +08002086VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002087 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2088 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002089 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2090 assert(my_data != NULL);
2091
Dustin Graves20fd66f2016-04-18 18:33:21 -06002092 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002093
Dustin Graves20fd66f2016-04-18 18:33:21 -06002094 if (!skipCall) {
2095 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2096
2097 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2098 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002099
2100 return result;
2101}
2102
Chia-I Wu01ca2372016-05-13 14:37:49 +08002103VKAPI_ATTR VkResult VKAPI_CALL
2104WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002105 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002106 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002107 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002109
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002110 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002111
Dustin Graves080069b2016-04-05 13:48:15 -06002112 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002113 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2114
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002115 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002116 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002117
2118 return result;
2119}
2120
Chia-I Wu01ca2372016-05-13 14:37:49 +08002121VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002122 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2123 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002124 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002125 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002126 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002127
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002128 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002129
Dustin Graves080069b2016-04-05 13:48:15 -06002130 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002131 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2132
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002133 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002134 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002135
2136 return result;
2137}
2138
Chia-I Wu01ca2372016-05-13 14:37:49 +08002139VKAPI_ATTR void VKAPI_CALL
2140DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002141 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002142 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002143 assert(my_data != NULL);
2144
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002145 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002146
Dustin Graves080069b2016-04-05 13:48:15 -06002147 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002148 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002149 }
2150}
2151
Chia-I Wu01ca2372016-05-13 14:37:49 +08002152VKAPI_ATTR VkResult VKAPI_CALL
2153CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002154 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002155 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002156 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002157 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002158
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002159 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002160
Dustin Graves080069b2016-04-05 13:48:15 -06002161 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002162 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2163
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002164 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002165 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002166
2167 return result;
2168}
2169
Chia-I Wu01ca2372016-05-13 14:37:49 +08002170VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002171 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002172 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002173 assert(my_data != NULL);
2174
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002175 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002176
Dustin Graves080069b2016-04-05 13:48:15 -06002177 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002178 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002179 }
2180}
2181
Chia-I Wu01ca2372016-05-13 14:37:49 +08002182VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002183 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2184 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002185 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2186 assert(my_data != NULL);
2187
Dustin Graves20fd66f2016-04-18 18:33:21 -06002188 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002189
Dustin Graves20fd66f2016-04-18 18:33:21 -06002190 if (!skipCall) {
2191 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2192
2193 validate_result(my_data->report_data, "vkGetEventStatus", result);
2194 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002195
2196 return result;
2197}
2198
Chia-I Wu01ca2372016-05-13 14:37:49 +08002199VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002200 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2201 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002202 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2203 assert(my_data != NULL);
2204
Dustin Graves20fd66f2016-04-18 18:33:21 -06002205 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002206
Dustin Graves20fd66f2016-04-18 18:33:21 -06002207 if (!skipCall) {
2208 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2209
2210 validate_result(my_data->report_data, "vkSetEvent", result);
2211 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002212
2213 return result;
2214}
2215
Chia-I Wu01ca2372016-05-13 14:37:49 +08002216VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002217 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2218 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002219 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2220 assert(my_data != NULL);
2221
Dustin Graves20fd66f2016-04-18 18:33:21 -06002222 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002223
Dustin Graves20fd66f2016-04-18 18:33:21 -06002224 if (!skipCall) {
2225 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2226
2227 validate_result(my_data->report_data, "vkResetEvent", result);
2228 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002229
2230 return result;
2231}
2232
Chia-I Wu01ca2372016-05-13 14:37:49 +08002233VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2234 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002235 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002236 bool skip_call = false;
2237 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2238 assert(device_data != nullptr);
2239 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002240
Dustin Gravesc900f572016-05-16 11:07:59 -06002241 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242
Dustin Gravesc900f572016-05-16 11:07:59 -06002243 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2244 if (pCreateInfo != nullptr) {
2245 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2246 // VkQueryPipelineStatisticFlagBits values
2247 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2248 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2249 skip_call |=
2250 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2251 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2252 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2253 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2254 }
2255 }
2256
2257 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002258 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2259
Dustin Gravesc900f572016-05-16 11:07:59 -06002260 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002261 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002262
2263 return result;
2264}
2265
Chia-I Wu01ca2372016-05-13 14:37:49 +08002266VKAPI_ATTR void VKAPI_CALL
2267DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002268 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002270 assert(my_data != NULL);
2271
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002272 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002273
Dustin Graves080069b2016-04-05 13:48:15 -06002274 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002275 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002276 }
2277}
2278
Chia-I Wu01ca2372016-05-13 14:37:49 +08002279VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2280 uint32_t queryCount, size_t dataSize, void *pData,
2281 VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002282 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002283 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002284 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002285 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002287 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002288 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002289
Dustin Graves080069b2016-04-05 13:48:15 -06002290 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002291 result = get_dispatch_table(pc_device_table_map, device)
2292 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002293
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002294 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002295 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002296
2297 return result;
2298}
2299
Chia-I Wu01ca2372016-05-13 14:37:49 +08002300VKAPI_ATTR VkResult VKAPI_CALL
2301CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002302 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002303 bool skip_call = false;
2304 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2305 assert(device_data != nullptr);
2306 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002307
Dustin Gravesc900f572016-05-16 11:07:59 -06002308 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002309
Dustin Gravesc900f572016-05-16 11:07:59 -06002310 if (pCreateInfo != nullptr) {
2311 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2312 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2313 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2314 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2315 skip_call |=
2316 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2317 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2318 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2319 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002320
Dustin Gravesc900f572016-05-16 11:07:59 -06002321 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2322 // queueFamilyIndexCount uint32_t values
2323 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2324 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2325 __LINE__, REQUIRED_PARAMETER, LayerName,
2326 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2327 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2328 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2329 }
2330
2331 // Ensure that the queue family indices were specified at device creation
2332 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2333 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2334 }
2335 }
2336
2337 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002338 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2339
Dustin Gravesc900f572016-05-16 11:07:59 -06002340 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002341 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002342
2343 return result;
2344}
2345
Chia-I Wu01ca2372016-05-13 14:37:49 +08002346VKAPI_ATTR void VKAPI_CALL
2347DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002348 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002349 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002350 assert(my_data != NULL);
2351
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002352 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002353
Dustin Graves080069b2016-04-05 13:48:15 -06002354 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002355 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002356 }
2357}
2358
Chia-I Wu01ca2372016-05-13 14:37:49 +08002359VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2360 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002361 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002362 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002363 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002364 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002365
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002366 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002367
Dustin Graves080069b2016-04-05 13:48:15 -06002368 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002369 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2370
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002371 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002372 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002373
2374 return result;
2375}
2376
Chia-I Wu01ca2372016-05-13 14:37:49 +08002377VKAPI_ATTR void VKAPI_CALL
2378DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002379 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002380 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002381 assert(my_data != NULL);
2382
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002383 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002384
Dustin Graves080069b2016-04-05 13:48:15 -06002385 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002386 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002387 }
2388}
2389
Chia-I Wu01ca2372016-05-13 14:37:49 +08002390VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2391 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002392 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2393 bool skip_call = false;
2394 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002395 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002396 debug_report_data *report_data = device_data->report_data;
2397
2398 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2399
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002400 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002401 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002402 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002403 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2404 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2405 skip_call |=
2406 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2407 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2408 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2409 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002410
Dustin Gravesc900f572016-05-16 11:07:59 -06002411 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2412 // queueFamilyIndexCount uint32_t values
2413 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2414 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2415 __LINE__, REQUIRED_PARAMETER, LayerName,
2416 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2417 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2418 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2419 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002420
2421 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2422 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2423 }
2424
2425 // width, height, and depth members of extent must be greater than 0
2426 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2427 0u);
2428 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2429 0u);
2430 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2431 0u);
2432
2433 // mipLevels must be greater than 0
2434 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2435 0u);
2436
2437 // arrayLayers must be greater than 0
2438 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2439 0u);
2440
2441 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2442 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2443 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2444 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002445 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002446 }
2447
2448 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2449 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2450 // extent.height must be equal
2451 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2452 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002453 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2454 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2455 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2456 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002457 }
2458
2459 if (pCreateInfo->extent.depth != 1) {
2460 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002461 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002462 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2463 }
2464 }
2465
2466 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2467 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2468 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2469 skip_call |= log_msg(
2470 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2471 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2472 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2473 }
2474
2475 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2476 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2477 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2478 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2479 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2480 LayerName,
2481 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2482 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002483 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002484 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002485
Dustin Gravesf8032f22016-05-11 18:31:44 -06002486 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002487 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2488
Dustin Gravesf8032f22016-05-11 18:31:44 -06002489 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002490 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002491
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002492 return result;
2493}
2494
Chia-I Wu01ca2372016-05-13 14:37:49 +08002495VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002496 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002498 assert(my_data != NULL);
2499
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002500 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002501
Dustin Graves080069b2016-04-05 13:48:15 -06002502 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002503 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002504 }
2505}
2506
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002507bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2508 if (pSubresource != nullptr) {
2509 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2510 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002511 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002512 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002513 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2514 return false;
2515 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002516 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002517
2518 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002519}
2520
Chia-I Wu01ca2372016-05-13 14:37:49 +08002521VKAPI_ATTR void VKAPI_CALL
2522GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002523 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002524 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002525 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002526
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002527 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002528
Dustin Graves080069b2016-04-05 13:48:15 -06002529 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002530 PreGetImageSubresourceLayout(device, pSubresource);
2531
2532 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002533 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002534}
2535
Chia-I Wu01ca2372016-05-13 14:37:49 +08002536VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2537 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002538 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002539 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002540 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002541 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002542 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002543
Dustin Graves0b70a632016-04-27 17:44:56 -06002544 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002545
Dustin Graves0b70a632016-04-27 17:44:56 -06002546 if (pCreateInfo != nullptr) {
2547 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002548 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2549 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002550 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2551 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2552 "pCreateInfo->subresourceRange.layerCount must be 1",
2553 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2554 }
2555 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002556 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2557 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2558 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002559 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2560 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2561 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2562 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2563 }
2564 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002565 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2566 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002567 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2568 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2569 "pCreateInfo->subresourceRange.layerCount must be 6");
2570 }
2571 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002572 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2573 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002574 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_CUBE_ARRAY, "
2576 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2577 }
2578 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2579 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
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.baseArrayLayer must be 0");
2583 }
2584
Dustin Graves2a80dc62016-07-12 13:57:02 -06002585 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2586 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002587 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2588 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2589 "pCreateInfo->subresourceRange.layerCount must be 1");
2590 }
2591 }
2592 }
2593
2594 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002595 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2596
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002597 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002599
2600 return result;
2601}
2602
Chia-I Wu01ca2372016-05-13 14:37:49 +08002603VKAPI_ATTR void VKAPI_CALL
2604DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002605 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002606 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002607 assert(my_data != NULL);
2608
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002609 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002610
Dustin Graves080069b2016-04-05 13:48:15 -06002611 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002612 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002613 }
2614}
2615
Chia-I Wu01ca2372016-05-13 14:37:49 +08002616VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2617 const VkAllocationCallbacks *pAllocator,
2618 VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002619 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002620 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002621 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002622 assert(my_data != NULL);
2623
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002624 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002625
Dustin Graves080069b2016-04-05 13:48:15 -06002626 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002627 result =
2628 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002629
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002630 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002631 }
2632
Michael Lentine03d8e572015-09-15 14:59:14 -05002633 return result;
2634}
2635
Chia-I Wu01ca2372016-05-13 14:37:49 +08002636VKAPI_ATTR void VKAPI_CALL
2637DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002638 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002639 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002640 assert(my_data != NULL);
2641
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002642 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002643
Dustin Graves080069b2016-04-05 13:48:15 -06002644 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002645 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002646 }
2647}
2648
Chia-I Wu01ca2372016-05-13 14:37:49 +08002649VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2650 const VkAllocationCallbacks *pAllocator,
2651 VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002652 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002653 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002654 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002655 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002656
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002657 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002658
Dustin Graves080069b2016-04-05 13:48:15 -06002659 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002660 result =
2661 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002663 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002664 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002665
2666 return result;
2667}
2668
Chia-I Wu01ca2372016-05-13 14:37:49 +08002669VKAPI_ATTR void VKAPI_CALL
2670DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002671 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002672 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002673 assert(my_data != NULL);
2674
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002675 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002676
Dustin Graves080069b2016-04-05 13:48:15 -06002677 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002678 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002679 }
2680}
2681
Chia-I Wu01ca2372016-05-13 14:37:49 +08002682VKAPI_ATTR VkResult VKAPI_CALL
2683GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002685 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002687 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002688
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002689 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002690
Dustin Graves080069b2016-04-05 13:48:15 -06002691 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002692 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2693
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002694 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002695 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002696
2697 return result;
2698}
2699
Chia-I Wu01ca2372016-05-13 14:37:49 +08002700VKAPI_ATTR VkResult VKAPI_CALL
2701MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002702 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002703 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002704 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002705 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002706
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002707 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002708
Dustin Graves080069b2016-04-05 13:48:15 -06002709 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002710 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2711
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002712 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002713 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002714
2715 return result;
2716}
2717
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002718bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002719 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2720
2721 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002722 if (pCreateInfos != nullptr) {
2723 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2724 if (pCreateInfos->basePipelineIndex != -1) {
2725 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002726 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002727 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002728 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2729 "pCreateInfos->flags "
2730 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2731 return false;
2732 }
2733 }
2734
2735 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2736 if (pCreateInfos->basePipelineIndex != -1) {
2737 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002738 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002739 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002740 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2741 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2742 "VK_NULL_HANDLE");
2743 return false;
2744 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002745 }
2746 }
2747
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002748 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002749 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002750 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002751 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002752 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2753 "unrecognized enumerator");
2754 return false;
2755 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002756 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002757
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002758 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002759 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002760 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002761 pCreateInfos[i].pStages[j].pName);
2762 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002763 }
2764
2765 return true;
2766}
2767
Chia-I Wu01ca2372016-05-13 14:37:49 +08002768VKAPI_ATTR VkResult VKAPI_CALL
2769CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2770 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2771 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002772 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002773 bool skip_call = false;
2774 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2775 assert(device_data != nullptr);
2776 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002777
Dustin Gravesc900f572016-05-16 11:07:59 -06002778 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2779 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002780
Dustin Gravesc900f572016-05-16 11:07:59 -06002781 if (pCreateInfos != nullptr) {
2782 for (uint32_t i = 0; i < createInfoCount; ++i) {
2783 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2784 if (pCreateInfos[i].pTessellationState == nullptr) {
2785 if (pCreateInfos[i].pStages != nullptr) {
2786 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2787 // pTessellationState must not be NULL
2788 bool has_control = false;
2789 bool has_eval = false;
2790
2791 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2792 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2793 has_control = true;
2794 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2795 has_eval = true;
2796 }
2797 }
2798
2799 if (has_control && has_eval) {
2800 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2801 __LINE__, REQUIRED_PARAMETER, LayerName,
2802 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2803 "control shader stage and a tessellation evaluation shader stage, "
2804 "pCreateInfos[%d].pTessellationState must not be NULL",
2805 i, i);
2806 }
2807 }
Dustin Graves629259b2016-05-30 16:14:27 -06002808 } else {
2809 skip_call |=
2810 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002811 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002812
2813 skip_call |=
2814 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2815 pCreateInfos[i].pTessellationState->flags);
2816
2817 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2818 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2819 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2820 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2821 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2822 i);
2823 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002824 }
2825
2826 if (pCreateInfos[i].pViewportState == nullptr) {
2827 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2828 // valid VkPipelineViewportStateCreateInfo structure
2829 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2830 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2831 skip_call |= log_msg(
2832 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2833 REQUIRED_PARAMETER, LayerName,
2834 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2835 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2836 i, i);
2837 }
2838 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002839 skip_call |=
2840 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002841 pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002842
2843 skip_call |=
2844 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2845 pCreateInfos[i].pViewportState->flags);
2846
Dustin Gravesc900f572016-05-16 11:07:59 -06002847 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2848 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2849 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2850 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2851 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2852 i);
2853 }
2854
2855 if (pCreateInfos[i].pDynamicState != nullptr) {
2856 bool has_dynamic_viewport = false;
2857 bool has_dynamic_scissor = false;
2858
2859 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2860 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2861 has_dynamic_viewport = true;
2862 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2863 has_dynamic_scissor = true;
2864 }
2865 }
2866
2867 // viewportCount must be greater than 0
2868 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2869 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2870 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2871 __LINE__, REQUIRED_PARAMETER, LayerName,
2872 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2873 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2874 "must be greater than 0",
2875 i, i);
2876 }
2877
2878 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2879 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2880 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2881 skip_call |=
2882 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2883 __LINE__, REQUIRED_PARAMETER, LayerName,
2884 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2885 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2886 i, i);
2887 }
2888
2889 // scissorCount must be greater than 0
2890 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2891 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2892 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2893 __LINE__, REQUIRED_PARAMETER, LayerName,
2894 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2895 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2896 "must be greater than 0",
2897 i, i);
2898 }
2899
2900 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2901 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2902 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2903 skip_call |=
2904 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2905 __LINE__, REQUIRED_PARAMETER, LayerName,
2906 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2907 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2908 i, i);
2909 }
2910 }
2911 }
2912
2913 if (pCreateInfos[i].pMultisampleState == nullptr) {
2914 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2915 // a valid VkPipelineMultisampleStateCreateInfo structure
2916 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2917 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2918 skip_call |=
2919 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2920 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2921 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2922 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2923 i, i);
2924 }
Dustin Graves629259b2016-05-30 16:14:27 -06002925 } else {
2926 skip_call |=
2927 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002928 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002929
2930 skip_call |=
2931 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2932 pCreateInfos[i].pMultisampleState->flags);
2933
2934 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2935 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2936 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2937
2938 skip_call |= validate_array(
2939 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2940 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2941 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2942
2943 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2944 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2945 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2946
2947 skip_call |=
2948 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2949 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
2950
2951 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2952 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2953 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2954 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2955 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2956 i);
2957 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002958 }
2959
2960 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06002961 if (pCreateInfos[i].pDepthStencilState != nullptr) {
2962 skip_call |=
2963 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002964 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002965
2966 skip_call |=
2967 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
2968 pCreateInfos[i].pDepthStencilState->flags);
2969
2970 skip_call |=
2971 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
2972 pCreateInfos[i].pDepthStencilState->depthTestEnable);
2973
2974 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2975 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
2976 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
2977
2978 skip_call |= validate_ranged_enum(
2979 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
2980 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
2981
2982 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2983 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
2984 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
2985
2986 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2987 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
2988 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
2989
2990 skip_call |= validate_ranged_enum(
2991 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
2992 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
2993
2994 skip_call |= validate_ranged_enum(
2995 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
2996 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
2997
2998 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
2999 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
3000 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3001 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
3002
3003 skip_call |= validate_ranged_enum(
3004 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
3005 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
3006
3007 skip_call |= validate_ranged_enum(
3008 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
3009 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3010
3011 skip_call |= validate_ranged_enum(
3012 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
3013 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3014
3015 skip_call |= validate_ranged_enum(
3016 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
3017 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3018
3019 skip_call |= validate_ranged_enum(
3020 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3021 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3022
3023 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3024 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3025 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3026 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3027 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3028 i);
3029 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003030 }
3031
3032 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3033 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003034 skip_call |=
3035 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003036 pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003037
3038 skip_call |=
3039 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3040 pCreateInfos[i].pColorBlendState->flags);
3041
3042 skip_call |=
3043 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3044 pCreateInfos[i].pColorBlendState->logicOpEnable);
3045
3046 skip_call |= validate_array(
3047 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3048 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3049 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3050
3051 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3052 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3053 ++attachmentIndex) {
3054 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3055 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3056 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3057
3058 skip_call |= validate_ranged_enum(
3059 report_data, "vkCreateGraphicsPipelines",
3060 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3061 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3062 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3063
3064 skip_call |= validate_ranged_enum(
3065 report_data, "vkCreateGraphicsPipelines",
3066 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3067 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3068 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3069
3070 skip_call |= validate_ranged_enum(
3071 report_data, "vkCreateGraphicsPipelines",
3072 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3073 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3074
3075 skip_call |= validate_ranged_enum(
3076 report_data, "vkCreateGraphicsPipelines",
3077 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3078 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3079 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3080
3081 skip_call |= validate_ranged_enum(
3082 report_data, "vkCreateGraphicsPipelines",
3083 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3084 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3085 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3086
3087 skip_call |= validate_ranged_enum(
3088 report_data, "vkCreateGraphicsPipelines",
3089 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3090 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3091
3092 skip_call |=
3093 validate_flags(report_data, "vkCreateGraphicsPipelines",
3094 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3095 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3096 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3097 }
3098 }
3099
Dustin Gravesc900f572016-05-16 11:07:59 -06003100 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3101 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3102 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3103 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3104 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3105 i);
3106 }
3107
3108 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3109 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3110 skip_call |= validate_ranged_enum(
3111 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3112 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3113 }
3114 }
3115 }
3116 }
3117
3118 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003119 PreCreateGraphicsPipelines(device, pCreateInfos);
3120
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003121 result = get_dispatch_table(pc_device_table_map, device)
3122 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003123
Dustin Gravesc900f572016-05-16 11:07:59 -06003124 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003125 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003126
3127 return result;
3128}
3129
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003130bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003131 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003133 if (pCreateInfos != nullptr) {
3134 // TODO: Handle count!
3135 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003136 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003137 }
3138
3139 return true;
3140}
3141
Chia-I Wu01ca2372016-05-13 14:37:49 +08003142VKAPI_ATTR VkResult VKAPI_CALL
3143CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3144 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3145 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003146 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003147 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003149 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003150
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003151 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003152 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003153
Dustin Graves080069b2016-04-05 13:48:15 -06003154 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003155 PreCreateComputePipelines(device, pCreateInfos);
3156
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003157 result = get_dispatch_table(pc_device_table_map, device)
3158 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003159
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003160 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003161 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003162
3163 return result;
3164}
3165
Chia-I Wu01ca2372016-05-13 14:37:49 +08003166VKAPI_ATTR void VKAPI_CALL
3167DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003168 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003169 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003170 assert(my_data != NULL);
3171
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003172 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003173
Dustin Graves080069b2016-04-05 13:48:15 -06003174 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003175 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003176 }
3177}
3178
Chia-I Wu01ca2372016-05-13 14:37:49 +08003179VKAPI_ATTR VkResult VKAPI_CALL
3180CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3181 VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003183 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003185 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003186
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003187 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003188
Dustin Graves080069b2016-04-05 13:48:15 -06003189 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003190 result =
3191 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003192
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003193 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003194 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003195
3196 return result;
3197}
3198
Chia-I Wu01ca2372016-05-13 14:37:49 +08003199VKAPI_ATTR void VKAPI_CALL
3200DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003201 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003202 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003203 assert(my_data != NULL);
3204
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003205 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003206
Dustin Graves080069b2016-04-05 13:48:15 -06003207 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003208 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003209 }
3210}
3211
Chia-I Wu01ca2372016-05-13 14:37:49 +08003212VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3213 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003214 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003215 bool skip_call = false;
3216 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3217 assert(device_data != NULL);
3218 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003219
Dustin Gravesc900f572016-05-16 11:07:59 -06003220 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003221
Dustin Gravesc900f572016-05-16 11:07:59 -06003222 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3223 if (pCreateInfo != nullptr) {
3224 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3225 if (pCreateInfo->compareEnable == VK_TRUE) {
3226 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3227 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3228 }
3229
3230 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3231 // valid VkBorderColor value
3232 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3233 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3234 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3235 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3236 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3237 }
3238 }
3239
3240 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003241 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3242
Dustin Gravesc900f572016-05-16 11:07:59 -06003243 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003244 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003245
3246 return result;
3247}
3248
Chia-I Wu01ca2372016-05-13 14:37:49 +08003249VKAPI_ATTR void VKAPI_CALL
3250DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003251 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003252 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003253 assert(my_data != NULL);
3254
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003255 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003256
Dustin Graves080069b2016-04-05 13:48:15 -06003257 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003258 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003259 }
3260}
3261
Chia-I Wu01ca2372016-05-13 14:37:49 +08003262VKAPI_ATTR VkResult VKAPI_CALL
3263CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3264 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003265 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003266 bool skip_call = false;
3267 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3268 assert(device_data != nullptr);
3269 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003270
Dustin Gravesc900f572016-05-16 11:07:59 -06003271 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003272
Dustin Gravesc900f572016-05-16 11:07:59 -06003273 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3274 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3275 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3276 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3277 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3278 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3279 // valid VkSampler handles
3280 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3281 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3282 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3283 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3284 ++descriptor_index) {
3285 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3286 skip_call |=
3287 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3288 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3289 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3290 " specified as VK_NULL_HANDLE",
3291 i, descriptor_index);
3292 }
3293 }
3294 }
3295
3296 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3297 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3298 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3299 skip_call |=
3300 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3301 UNRECOGNIZED_VALUE, LayerName,
3302 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3303 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3304 i, i);
3305 }
3306 }
3307 }
3308 }
3309
3310 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311 result =
3312 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003313
Dustin Gravesc900f572016-05-16 11:07:59 -06003314 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003315 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003316
3317 return result;
3318}
3319
Chia-I Wu01ca2372016-05-13 14:37:49 +08003320VKAPI_ATTR void VKAPI_CALL
3321DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003322 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003323 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003324 assert(my_data != NULL);
3325
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003326 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003327
Dustin Graves080069b2016-04-05 13:48:15 -06003328 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003329 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003330 }
3331}
3332
Chia-I Wu01ca2372016-05-13 14:37:49 +08003333VKAPI_ATTR VkResult VKAPI_CALL
3334CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3335 VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003336 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003337 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003338 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003339 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003340
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003341 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003342
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003343 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3344
Dustin Graves080069b2016-04-05 13:48:15 -06003345 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003346 result =
3347 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003349 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003350 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003351
3352 return result;
3353}
3354
Chia-I Wu01ca2372016-05-13 14:37:49 +08003355VKAPI_ATTR void VKAPI_CALL
3356DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003357 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003358 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003359 assert(my_data != NULL);
3360
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003361 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003362
Dustin Graves080069b2016-04-05 13:48:15 -06003363 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003364 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003365 }
3366}
3367
Chia-I Wu01ca2372016-05-13 14:37:49 +08003368VKAPI_ATTR VkResult VKAPI_CALL
3369ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003370 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3371 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003372 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3373 assert(my_data != NULL);
3374
Dustin Graves20fd66f2016-04-18 18:33:21 -06003375 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003376
Dustin Graves20fd66f2016-04-18 18:33:21 -06003377 if (!skipCall) {
3378 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3379
3380 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3381 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003382
3383 return result;
3384}
3385
Chia-I Wu01ca2372016-05-13 14:37:49 +08003386VKAPI_ATTR VkResult VKAPI_CALL
3387AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003388 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003389 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003390 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003391 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003392
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003393 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003394
Dustin Graves080069b2016-04-05 13:48:15 -06003395 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003396 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3397
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003398 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003399 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003400
3401 return result;
3402}
3403
Chia-I Wu01ca2372016-05-13 14:37:49 +08003404VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3405 uint32_t descriptorSetCount,
3406 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003407 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003408 bool skip_call = false;
3409 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3410 assert(device_data != nullptr);
3411 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003412
Dustin Gravesc900f572016-05-16 11:07:59 -06003413 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003414
Dustin Gravesc900f572016-05-16 11:07:59 -06003415 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3416 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3417 // validate_array()
3418 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3419 pDescriptorSets, true, true);
3420
3421 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003422 result = get_dispatch_table(pc_device_table_map, device)
3423 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003424
Dustin Gravesc900f572016-05-16 11:07:59 -06003425 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003426 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003427
3428 return result;
3429}
3430
Chia-I Wu01ca2372016-05-13 14:37:49 +08003431VKAPI_ATTR void VKAPI_CALL
3432UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3433 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003434 bool skip_call = false;
3435 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3436 assert(device_data != NULL);
3437 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003438
Dustin Gravesc900f572016-05-16 11:07:59 -06003439 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3440 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003441
Dustin Gravesc900f572016-05-16 11:07:59 -06003442 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3443 if (pDescriptorWrites != NULL) {
3444 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3445 // descriptorCount must be greater than 0
3446 if (pDescriptorWrites[i].descriptorCount == 0) {
3447 skip_call |=
3448 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3449 REQUIRED_PARAMETER, LayerName,
3450 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3451 }
3452
3453 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3454 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3455 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3456 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3457 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3458 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3459 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3460 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3461 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3462 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3463 __LINE__, REQUIRED_PARAMETER, LayerName,
3464 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3465 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3466 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3467 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3468 i, i);
3469 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3470 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3471 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3472 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3473 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3474 ++descriptor_index) {
3475 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3476 "pDescriptorWrites[i].pImageInfo[i].imageView",
3477 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3478 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3479 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3480 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3481 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3482 }
3483 }
3484 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3485 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3486 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3487 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3488 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3489 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3490 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3491 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3492 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3493 __LINE__, REQUIRED_PARAMETER, LayerName,
3494 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3495 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3496 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3497 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3498 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003499 } else {
3500 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3501 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3502 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3503 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3504 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003505 }
3506 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3507 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3508 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3509 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3510 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3511 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3512 __LINE__, REQUIRED_PARAMETER, LayerName,
3513 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3514 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3515 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3516 i, i);
3517 } else {
3518 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3519 ++descriptor_index) {
3520 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3521 "pDescriptorWrites[i].pTexelBufferView[i]",
3522 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3523 }
3524 }
3525 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003526
3527 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3528 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3529 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3530 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3531 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3532 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3533 skip_call |=
3534 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003535 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003536 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3537 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3538 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3539 }
3540 }
3541 }
3542 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3543 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3544 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3545 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3546 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3547 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3548 skip_call |=
3549 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003550 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003551 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3552 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3553 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3554 }
3555 }
3556 }
3557 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003558 }
3559 }
3560
3561 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003562 get_dispatch_table(pc_device_table_map, device)
3563 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003564 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003565}
3566
Chia-I Wu01ca2372016-05-13 14:37:49 +08003567VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3568 const VkAllocationCallbacks *pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003569 VkFramebuffer *pFramebuffer) {
3570 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003571 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003572 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003573 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003574
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003575 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003576
Dustin Graves080069b2016-04-05 13:48:15 -06003577 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003578 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3579
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003580 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003581 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003582
3583 return result;
3584}
3585
Chia-I Wu01ca2372016-05-13 14:37:49 +08003586VKAPI_ATTR void VKAPI_CALL
3587DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003588 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003589 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003590 assert(my_data != NULL);
3591
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003592 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003593
Dustin Graves080069b2016-04-05 13:48:15 -06003594 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003595 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003596 }
3597}
3598
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003599bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3600 bool skip_call = false;
3601 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3602
3603 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3604 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3605 skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3606 __LINE__, DEVICE_LIMIT, "DL",
3607 "Cannot create a render pass with %d color attachments. Max is %d.",
3608 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3609 }
3610 }
3611 return skip_call;
3612}
3613
Chia-I Wu01ca2372016-05-13 14:37:49 +08003614VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3615 const VkAllocationCallbacks *pAllocator,
3616 VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003617 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003618 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003619 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003620 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003621
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003622 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003623 skipCall |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003624
Dustin Graves080069b2016-04-05 13:48:15 -06003625 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003626 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3627
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003628 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003629 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003630
3631 return result;
3632}
3633
Chia-I Wu01ca2372016-05-13 14:37:49 +08003634VKAPI_ATTR void VKAPI_CALL
3635DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003636 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003637 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003638 assert(my_data != NULL);
3639
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003640 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003641
Dustin Graves080069b2016-04-05 13:48:15 -06003642 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003643 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003644 }
3645}
3646
Chia-I Wu01ca2372016-05-13 14:37:49 +08003647VKAPI_ATTR void VKAPI_CALL
3648GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003649 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003650 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003651 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003652
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003653 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003654
Dustin Graves080069b2016-04-05 13:48:15 -06003655 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003656 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003657 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003658}
3659
Chia-I Wu01ca2372016-05-13 14:37:49 +08003660VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3661 const VkAllocationCallbacks *pAllocator,
3662 VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003663 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003664 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003665 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003666 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003667
Dustin Gravesde628532016-04-21 16:30:17 -06003668 skipCall |=
3669 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003670
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003671 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003672
Dustin Graves080069b2016-04-05 13:48:15 -06003673 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003674 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3675
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003676 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003677 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003678
3679 return result;
3680}
3681
Chia-I Wu01ca2372016-05-13 14:37:49 +08003682VKAPI_ATTR void VKAPI_CALL
3683DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003684 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003685 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003686 assert(my_data != NULL);
3687
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003688 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003689
Dustin Graves080069b2016-04-05 13:48:15 -06003690 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003691 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003692 }
3693}
3694
Chia-I Wu01ca2372016-05-13 14:37:49 +08003695VKAPI_ATTR VkResult VKAPI_CALL
3696ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003697 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3698 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003699 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3700 assert(my_data != NULL);
3701
Dustin Graves20fd66f2016-04-18 18:33:21 -06003702 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003703
Dustin Graves20fd66f2016-04-18 18:33:21 -06003704 if (!skipCall) {
3705 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3706
3707 validate_result(my_data->report_data, "vkResetCommandPool", result);
3708 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003709
3710 return result;
3711}
3712
Chia-I Wu01ca2372016-05-13 14:37:49 +08003713VKAPI_ATTR VkResult VKAPI_CALL
3714AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003715 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003716 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003717 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003718 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003719
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003720 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003721
Dustin Graves080069b2016-04-05 13:48:15 -06003722 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003723 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3724
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003725 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003726 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003727
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003728 return result;
3729}
3730
Chia-I Wu01ca2372016-05-13 14:37:49 +08003731VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3732 uint32_t commandBufferCount,
3733 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003734 bool skip_call = false;
3735 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3736 assert(device_data != nullptr);
3737 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003738
Dustin Gravesc900f572016-05-16 11:07:59 -06003739 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003740
Dustin Gravesc900f572016-05-16 11:07:59 -06003741 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3742 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3743 // validate_array()
3744 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3745 pCommandBuffers, true, true);
3746
3747 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003748 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003749 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003750 }
3751}
3752
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003753bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3754 bool skip_call = false;
3755 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3756 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3757
3758 if (pInfo != NULL) {
3759 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3760 skip_call |=
3761 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003762 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003763 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3764 "inheritedQueries.");
3765 }
3766
3767 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3768 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3769 skip_call |=
3770 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003771 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003772 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3773 "valid combination of VkQueryControlFlagBits.",
3774 pInfo->queryFlags);
3775 }
3776 }
3777 return skip_call;
3778}
3779
3780VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003781 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003782 bool skip_call = false;
3783 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3784 assert(device_data != nullptr);
3785 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003786
Dustin Gravesc900f572016-05-16 11:07:59 -06003787 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003788
Dustin Gravesc900f572016-05-16 11:07:59 -06003789 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3790 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3791 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3792 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3793 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3794
3795 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003796 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003797 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003798
3799 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3800 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3801
Dustin Gravesc900f572016-05-16 11:07:59 -06003802 // TODO: This only needs to be validated when the inherited queries feature is enabled
3803 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3804 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3805
3806 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3807 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3808 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3809 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3810 }
3811
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003812 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3813
Dustin Gravesc900f572016-05-16 11:07:59 -06003814 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003815 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3816
Dustin Gravesc900f572016-05-16 11:07:59 -06003817 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003818 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003819
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003820 return result;
3821}
3822
Chia-I Wu01ca2372016-05-13 14:37:49 +08003823VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003824 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3825 assert(my_data != NULL);
3826
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003827 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003828
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003829 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003830
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003831 return result;
3832}
3833
Chia-I Wu01ca2372016-05-13 14:37:49 +08003834VKAPI_ATTR VkResult VKAPI_CALL
3835ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003836 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003837 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3838 assert(my_data != NULL);
3839
Dustin Graves16d18972016-05-09 17:36:57 -06003840 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003841
Dustin Graves16d18972016-05-09 17:36:57 -06003842 if (!skip_call) {
3843 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3844
3845 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3846 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003847
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003848 return result;
3849}
3850
Chia-I Wu01ca2372016-05-13 14:37:49 +08003851VKAPI_ATTR void VKAPI_CALL
3852CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003853 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003854 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3855 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003856
Dustin Graves29148ff2016-03-23 19:44:00 -06003857 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3858
Dustin Graves080069b2016-04-05 13:48:15 -06003859 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003860 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3861 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003862}
3863
Chia-I Wu01ca2372016-05-13 14:37:49 +08003864VKAPI_ATTR void VKAPI_CALL
3865CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003866 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003867 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003868 assert(my_data != NULL);
3869
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003870 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003871
Dustin Graves080069b2016-04-05 13:48:15 -06003872 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003873 get_dispatch_table(pc_device_table_map, commandBuffer)
3874 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003875 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003876}
3877
Chia-I Wu01ca2372016-05-13 14:37:49 +08003878VKAPI_ATTR void VKAPI_CALL
3879CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003880 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003881 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003882 assert(my_data != NULL);
3883
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003884 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003885
Dustin Graves080069b2016-04-05 13:48:15 -06003886 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003887 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3888 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003889}
3890
Chia-I Wu01ca2372016-05-13 14:37:49 +08003891VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003892 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003893}
3894
Chia-I Wu01ca2372016-05-13 14:37:49 +08003895VKAPI_ATTR void VKAPI_CALL
3896CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003897 get_dispatch_table(pc_device_table_map, commandBuffer)
3898 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003899}
3900
Chia-I Wu01ca2372016-05-13 14:37:49 +08003901VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003902 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003904 assert(my_data != NULL);
3905
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003906 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003907
Dustin Graves080069b2016-04-05 13:48:15 -06003908 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003909 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3910 }
Cody Northrop12365112015-08-17 11:10:49 -06003911}
3912
Chia-I Wu01ca2372016-05-13 14:37:49 +08003913VKAPI_ATTR void VKAPI_CALL
3914CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003915 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003916}
3917
Chia-I Wu01ca2372016-05-13 14:37:49 +08003918VKAPI_ATTR void VKAPI_CALL
3919CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003920 bool skipCall = false;
3921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3922 assert(my_data != NULL);
3923
3924 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3925
3926 if (!skipCall) {
3927 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3928 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003929}
3930
Chia-I Wu01ca2372016-05-13 14:37:49 +08003931VKAPI_ATTR void VKAPI_CALL
3932CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003933 bool skipCall = false;
3934 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3935 assert(my_data != NULL);
3936
3937 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3938
3939 if (!skipCall) {
3940 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3941 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003942}
3943
Chia-I Wu01ca2372016-05-13 14:37:49 +08003944VKAPI_ATTR void VKAPI_CALL
3945CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003946 bool skipCall = false;
3947 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3948 assert(my_data != NULL);
3949
3950 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3951
3952 if (!skipCall) {
3953 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3954 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003955}
3956
Chia-I Wu01ca2372016-05-13 14:37:49 +08003957VKAPI_ATTR void VKAPI_CALL
3958CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3959 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3960 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003961 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003962 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003963 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003964
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003965 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003966 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003967
Dustin Graves080069b2016-04-05 13:48:15 -06003968 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003969 get_dispatch_table(pc_device_table_map, commandBuffer)
3970 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3971 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003972 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003973}
3974
Chia-I Wu01ca2372016-05-13 14:37:49 +08003975VKAPI_ATTR void VKAPI_CALL
3976CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003977 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003978 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3979 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003980
Dustin Graves29148ff2016-03-23 19:44:00 -06003981 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3982
Dustin Graves080069b2016-04-05 13:48:15 -06003983 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003984 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3985 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003986}
3987
Chia-I Wu01ca2372016-05-13 14:37:49 +08003988VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3989 uint32_t bindingCount, const VkBuffer *pBuffers,
3990 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003991 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003992 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003993 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003994
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003995 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003996
Dustin Graves080069b2016-04-05 13:48:15 -06003997 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003998 get_dispatch_table(pc_device_table_map, commandBuffer)
3999 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004000 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004001}
4002
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004003bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4004 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004005 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004006 // 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 -07004007 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004008 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004009 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004010 return false;
4011 }
4012
4013 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004014 // 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 -07004015 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004016 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004017 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004018 return false;
4019 }
4020
4021 return true;
4022}
4023
Chia-I Wu01ca2372016-05-13 14:37:49 +08004024VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4025 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004026 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004027
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 get_dispatch_table(pc_device_table_map, commandBuffer)
4029 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004030}
4031
Chia-I Wu01ca2372016-05-13 14:37:49 +08004032VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
4033 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
4034 uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004035 get_dispatch_table(pc_device_table_map, commandBuffer)
4036 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004037}
4038
Chia-I Wu01ca2372016-05-13 14:37:49 +08004039VKAPI_ATTR void VKAPI_CALL
4040CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004041 bool skipCall = false;
4042 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4043 assert(my_data != NULL);
4044
4045 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
4046
4047 if (!skipCall) {
4048 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4049 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004050}
4051
Chia-I Wu01ca2372016-05-13 14:37:49 +08004052VKAPI_ATTR void VKAPI_CALL
4053CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004054 bool skipCall = false;
4055 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4056 assert(my_data != NULL);
4057
4058 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
4059
4060 if (!skipCall) {
4061 get_dispatch_table(pc_device_table_map, commandBuffer)
4062 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4063 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004064}
4065
Chia-I Wu01ca2372016-05-13 14:37:49 +08004066VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004067 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004068}
4069
Chia-I Wu01ca2372016-05-13 14:37:49 +08004070VKAPI_ATTR void VKAPI_CALL
4071CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004072 bool skipCall = false;
4073 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4074 assert(my_data != NULL);
4075
4076 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
4077
4078 if (!skipCall) {
4079 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4080 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004081}
4082
Chia-I Wu01ca2372016-05-13 14:37:49 +08004083VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4084 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004085 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004086 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004087 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004088
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004089 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004090
Dustin Graves080069b2016-04-05 13:48:15 -06004091 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004092 get_dispatch_table(pc_device_table_map, commandBuffer)
4093 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 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 PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *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__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004102 UNRECOGNIZED_VALUE, LayerName,
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__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004109 UNRECOGNIZED_VALUE, LayerName,
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
4119CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4120 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
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
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004125 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004126 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
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 PreCmdCopyImage(commandBuffer, pRegions);
4130
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004131 get_dispatch_table(pc_device_table_map, commandBuffer)
4132 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
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 PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4137 if (pRegions != nullptr) {
4138 if ((pRegions->srcSubresource.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__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004141 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004142 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4143 return false;
4144 }
4145 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4146 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004147 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004148 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004149 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4150 return false;
4151 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004152 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004153
4154 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004155}
4156
Chia-I Wu01ca2372016-05-13 14:37:49 +08004157VKAPI_ATTR void VKAPI_CALL
4158CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4159 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06004160 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004162 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004163
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004164 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004165 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004166
Dustin Graves080069b2016-04-05 13:48:15 -06004167 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004168 PreCmdBlitImage(commandBuffer, pRegions);
4169
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004170 get_dispatch_table(pc_device_table_map, commandBuffer)
4171 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004172 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004173}
4174
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004175bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4176 if (pRegions != nullptr) {
4177 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4178 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004179 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004180 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004181 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4182 "enumerator");
4183 return false;
4184 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004185 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004186
4187 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004188}
4189
Chia-I Wu01ca2372016-05-13 14:37:49 +08004190VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4191 VkImage dstImage, VkImageLayout dstImageLayout,
4192 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004193 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004194 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004195 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004197 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004198 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004199
Dustin Graves080069b2016-04-05 13:48:15 -06004200 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004201 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4202
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004203 get_dispatch_table(pc_device_table_map, commandBuffer)
4204 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004205 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004206}
4207
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004208bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4209 if (pRegions != nullptr) {
4210 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4211 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004212 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004213 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004214 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4215 "enumerator");
4216 return false;
4217 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004218 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004219
4220 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004221}
4222
Chia-I Wu01ca2372016-05-13 14:37:49 +08004223VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4224 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4225 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004226 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004227 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004228 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004229
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004230 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004231 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004232
Dustin Graves080069b2016-04-05 13:48:15 -06004233 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004234 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4235
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004236 get_dispatch_table(pc_device_table_map, commandBuffer)
4237 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004238 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004239}
4240
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004241VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4242 VkDeviceSize dataSize, const uint32_t *pData) {
4243 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004245 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004246
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004247 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004248
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004249 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004250 skip_call |= log_msg(
4251 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4252 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004253 }
4254
4255 if ((dataSize <= 0) || (dataSize > 65536)) {
4256 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004257 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4258 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004259 dataSize);
4260 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004261 skip_call |= log_msg(
4262 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4263 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004264 }
4265
4266 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004267 get_dispatch_table(pc_device_table_map, commandBuffer)
4268 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004269 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004270}
4271
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004272VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4273 VkDeviceSize size, uint32_t data) {
4274 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004275 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4276 assert(my_data != NULL);
4277
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004278 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004279
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004280 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004281 skip_call |= log_msg(
4282 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4283 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004284 }
4285
4286 if (size != VK_WHOLE_SIZE) {
4287 if (size <= 0) {
4288 skip_call |= log_msg(
4289 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004290 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004291 } else if (size & 3) {
4292 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004293 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004294 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4295 }
4296 }
4297
4298 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004299 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4300 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004301}
4302
Chia-I Wu01ca2372016-05-13 14:37:49 +08004303VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4304 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4305 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004306 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004307 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004308 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004309
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004310 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004311
Dustin Graves080069b2016-04-05 13:48:15 -06004312 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004313 get_dispatch_table(pc_device_table_map, commandBuffer)
4314 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004315 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004316}
4317
Chia-I Wu01ca2372016-05-13 14:37:49 +08004318VKAPI_ATTR void VKAPI_CALL
4319CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4320 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4321 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004322 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004323 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004324 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004325
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004326 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004327 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328
Dustin Graves080069b2016-04-05 13:48:15 -06004329 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004330 get_dispatch_table(pc_device_table_map, commandBuffer)
4331 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004332 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004333}
4334
Chia-I Wu01ca2372016-05-13 14:37:49 +08004335VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4336 const VkClearAttachment *pAttachments, uint32_t rectCount,
4337 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004338 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004339 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004340 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004341
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004342 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004343
Dustin Graves080069b2016-04-05 13:48:15 -06004344 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004345 get_dispatch_table(pc_device_table_map, commandBuffer)
4346 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004347 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004348}
4349
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004350bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4351 if (pRegions != nullptr) {
4352 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4353 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4354 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004355 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004356 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004357 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4358 return false;
4359 }
4360 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4361 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4362 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004363 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004364 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004365 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4366 return false;
4367 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004368 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004369
4370 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004371}
4372
Chia-I Wu01ca2372016-05-13 14:37:49 +08004373VKAPI_ATTR void VKAPI_CALL
4374CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4375 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004376 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004377 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004378 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004379
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004380 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004381 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004382
Dustin Graves080069b2016-04-05 13:48:15 -06004383 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004384 PreCmdResolveImage(commandBuffer, pRegions);
4385
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004386 get_dispatch_table(pc_device_table_map, commandBuffer)
4387 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004388 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004389}
4390
Chia-I Wu01ca2372016-05-13 14:37:49 +08004391VKAPI_ATTR void VKAPI_CALL
4392CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004393 bool skipCall = false;
4394 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4395 assert(my_data != NULL);
4396
4397 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4398
4399 if (!skipCall) {
4400 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4401 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004402}
4403
Chia-I Wu01ca2372016-05-13 14:37:49 +08004404VKAPI_ATTR void VKAPI_CALL
4405CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004406 bool skipCall = false;
4407 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4408 assert(my_data != NULL);
4409
4410 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4411
4412 if (!skipCall) {
4413 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4414 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004415}
4416
Chia-I Wu01ca2372016-05-13 14:37:49 +08004417VKAPI_ATTR void VKAPI_CALL
4418CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4419 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4420 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4421 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004422 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004423 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004424 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004425
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004426 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004427 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4428 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004429
Dustin Graves080069b2016-04-05 13:48:15 -06004430 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004431 get_dispatch_table(pc_device_table_map, commandBuffer)
4432 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4433 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004434 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004435}
4436
Chia-I Wu01ca2372016-05-13 14:37:49 +08004437VKAPI_ATTR void VKAPI_CALL
4438CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4439 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4440 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4441 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004442 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004443 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004444 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004445
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004446 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004447 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4448 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449
Dustin Graves080069b2016-04-05 13:48:15 -06004450 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004451 get_dispatch_table(pc_device_table_map, commandBuffer)
4452 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4453 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004454 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004455}
4456
Chia-I Wu01ca2372016-05-13 14:37:49 +08004457VKAPI_ATTR void VKAPI_CALL
4458CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004459 bool skipCall = false;
4460 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4461 assert(my_data != NULL);
4462
4463 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4464
4465 if (!skipCall) {
4466 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4467 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004468}
4469
Chia-I Wu01ca2372016-05-13 14:37:49 +08004470VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004471 bool skipCall = false;
4472 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4473 assert(my_data != NULL);
4474
4475 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4476
4477 if (!skipCall) {
4478 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4479 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004480}
4481
Chia-I Wu01ca2372016-05-13 14:37:49 +08004482VKAPI_ATTR void VKAPI_CALL
4483CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004484 bool skipCall = false;
4485 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4486 assert(my_data != NULL);
4487
4488 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4489
4490 if (!skipCall) {
4491 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4492 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004493}
4494
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004495bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4496 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004497
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004498 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004499
4500 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004501}
4502
Chia-I Wu01ca2372016-05-13 14:37:49 +08004503VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4504 VkQueryPool queryPool, uint32_t query) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004505 bool skipCall = false;
4506 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4507 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004508
Dustin Graves20fd66f2016-04-18 18:33:21 -06004509 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4510
4511 if (!skipCall) {
4512 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4513
4514 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4515 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004516}
4517
Chia-I Wu01ca2372016-05-13 14:37:49 +08004518VKAPI_ATTR void VKAPI_CALL
4519CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4520 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004521 bool skipCall = false;
4522 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4523 assert(my_data != NULL);
4524
4525 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4526 dstOffset, stride, flags);
4527
4528 if (!skipCall) {
4529 get_dispatch_table(pc_device_table_map, commandBuffer)
4530 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4531 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004532}
4533
Chia-I Wu01ca2372016-05-13 14:37:49 +08004534VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4535 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4536 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004537 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004539 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004540
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004541 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004542
Dustin Graves080069b2016-04-05 13:48:15 -06004543 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004544 get_dispatch_table(pc_device_table_map, commandBuffer)
4545 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004546 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004547}
4548
Chia-I Wu01ca2372016-05-13 14:37:49 +08004549VKAPI_ATTR void VKAPI_CALL
4550CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004551 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004552 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004553 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004554
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004555 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004556
Dustin Graves080069b2016-04-05 13:48:15 -06004557 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004558 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004559 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004560}
4561
Chia-I Wu01ca2372016-05-13 14:37:49 +08004562VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004563 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004564 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4565 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004566
Dustin Graves29148ff2016-03-23 19:44:00 -06004567 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4568
Dustin Graves080069b2016-04-05 13:48:15 -06004569 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004570 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4571 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004572}
4573
Chia-I Wu01ca2372016-05-13 14:37:49 +08004574VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004575 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004576}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004577
Chia-I Wu01ca2372016-05-13 14:37:49 +08004578VKAPI_ATTR void VKAPI_CALL
4579CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004580 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004581 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004582 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004583
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004584 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004585
Dustin Graves080069b2016-04-05 13:48:15 -06004586 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004587 get_dispatch_table(pc_device_table_map, commandBuffer)
4588 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004589 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004590}
4591
Chia-I Wub02600c2016-05-20 07:11:22 +08004592VKAPI_ATTR VkResult VKAPI_CALL
4593EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4594 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4595}
4596
4597VKAPI_ATTR VkResult VKAPI_CALL
4598EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
4599 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4600}
4601
4602VKAPI_ATTR VkResult VKAPI_CALL
4603EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
4604 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4605 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4606
4607 return VK_ERROR_LAYER_NOT_PRESENT;
4608}
4609
Chia-I Wu01ca2372016-05-13 14:37:49 +08004610VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4611 const char *pLayerName, uint32_t *pCount,
4612 VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004613 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004614 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004615 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004616
4617 assert(physicalDevice);
4618
4619 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4620 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004621}
4622
Chia-I Wuf9b01382016-05-16 07:37:41 +08004623static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004624intercept_core_instance_command(const char *name);
4625
4626static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004627intercept_core_device_command(const char *name);
4628
Chia-I Wu01ca2372016-05-13 14:37:49 +08004629VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08004630 assert(device);
4631
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004632 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4633
Dustin Graves080069b2016-04-05 13:48:15 -06004634 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004635 return NULL;
4636 }
4637
Chia-I Wuf9b01382016-05-16 07:37:41 +08004638 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
4639 if (proc)
4640 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004641
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004642 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004643 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004644 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004645}
4646
Chia-I Wu01ca2372016-05-13 14:37:49 +08004647VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08004648 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08004649 if (!proc)
4650 proc = intercept_core_device_command(funcName);
Chia-I Wu617f2a42016-05-16 07:41:17 +08004651 if (proc)
4652 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004653
Chia-I Wu617f2a42016-05-16 07:41:17 +08004654 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004655
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004656 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004657
Chia-I Wu617f2a42016-05-16 07:41:17 +08004658 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
4659 if (proc)
4660 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004661
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004662 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004663 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004664 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004665}
Chia-I Wu99f701c2016-05-13 14:06:08 +08004666
Chia-I Wuf9b01382016-05-16 07:37:41 +08004667static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004668intercept_core_instance_command(const char *name) {
4669 static const struct {
4670 const char *name;
4671 PFN_vkVoidFunction proc;
4672 } core_instance_commands[] = {
4673 { "vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr) },
4674 { "vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance) },
4675 { "vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance) },
4676 { "vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice) },
4677 { "vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices) },
4678 { "vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties) },
4679 { "vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures) },
4680 { "vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties) },
4681 { "vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties) },
4682 { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties) },
4683 { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties) },
4684 { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties) },
Chia-I Wub02600c2016-05-20 07:11:22 +08004685 { "vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties) },
4686 { "vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties) },
4687 { "vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08004688 { "vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties) },
4689 };
4690
4691 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
4692 if (!strcmp(core_instance_commands[i].name, name))
4693 return core_instance_commands[i].proc;
4694 }
4695
4696 return nullptr;
4697}
4698
4699static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004700intercept_core_device_command(const char *name) {
4701 static const struct {
4702 const char *name;
4703 PFN_vkVoidFunction proc;
4704 } core_device_commands[] = {
4705 { "vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr) },
4706 { "vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice) },
4707 { "vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue) },
4708 { "vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit) },
4709 { "vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle) },
4710 { "vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle) },
4711 { "vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory) },
4712 { "vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory) },
4713 { "vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory) },
4714 { "vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory) },
4715 { "vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges) },
4716 { "vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges) },
4717 { "vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment) },
4718 { "vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory) },
4719 { "vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory) },
4720 { "vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence) },
4721 { "vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence) },
4722 { "vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences) },
4723 { "vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus) },
4724 { "vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences) },
4725 { "vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore) },
4726 { "vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore) },
4727 { "vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent) },
4728 { "vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent) },
4729 { "vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus) },
4730 { "vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent) },
4731 { "vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent) },
4732 { "vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool) },
4733 { "vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool) },
4734 { "vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults) },
4735 { "vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer) },
4736 { "vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer) },
4737 { "vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView) },
4738 { "vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView) },
4739 { "vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage) },
4740 { "vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage) },
4741 { "vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout) },
4742 { "vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView) },
4743 { "vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView) },
4744 { "vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule) },
4745 { "vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule) },
4746 { "vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache) },
4747 { "vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache) },
4748 { "vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData) },
4749 { "vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches) },
4750 { "vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines) },
4751 { "vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines) },
4752 { "vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline) },
4753 { "vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout) },
4754 { "vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout) },
4755 { "vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler) },
4756 { "vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler) },
4757 { "vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout) },
4758 { "vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout) },
4759 { "vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool) },
4760 { "vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool) },
4761 { "vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool) },
4762 { "vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets) },
4763 { "vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets) },
4764 { "vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets) },
4765 { "vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport) },
4766 { "vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor) },
4767 { "vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth) },
4768 { "vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias) },
4769 { "vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants) },
4770 { "vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds) },
4771 { "vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask) },
4772 { "vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask) },
4773 { "vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference) },
4774 { "vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers) },
4775 { "vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers) },
4776 { "vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer) },
4777 { "vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer) },
4778 { "vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer) },
4779 { "vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline) },
4780 { "vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets) },
4781 { "vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers) },
4782 { "vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer) },
4783 { "vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw) },
4784 { "vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed) },
4785 { "vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect) },
4786 { "vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect) },
4787 { "vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch) },
4788 { "vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect) },
4789 { "vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer) },
4790 { "vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage) },
4791 { "vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage) },
4792 { "vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage) },
4793 { "vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer) },
4794 { "vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer) },
4795 { "vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer) },
4796 { "vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage) },
Chris Forbesfb1426b2016-08-04 15:59:38 +12004797 { "vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage) },
4798 { "vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments) },
Chia-I Wuf9b01382016-05-16 07:37:41 +08004799 { "vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage) },
4800 { "vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent) },
4801 { "vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent) },
4802 { "vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents) },
4803 { "vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier) },
4804 { "vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery) },
4805 { "vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery) },
4806 { "vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool) },
4807 { "vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp) },
4808 { "vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults) },
Chris Forbesfb1426b2016-08-04 15:59:38 +12004809 { "vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants) },
Chia-I Wuf9b01382016-05-16 07:37:41 +08004810 { "vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer) },
4811 { "vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer) },
4812 { "vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass) },
4813 { "vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass) },
4814 { "vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity) },
4815 { "vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool) },
4816 { "vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool) },
4817 { "vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool) },
4818 { "vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass) },
4819 { "vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass) },
Chris Forbesfb1426b2016-08-04 15:59:38 +12004820 { "vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands) },
4821 { "vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass) },
Chia-I Wuf9b01382016-05-16 07:37:41 +08004822 };
4823
4824 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
4825 if (!strcmp(core_device_commands[i].name, name))
4826 return core_device_commands[i].proc;
4827 }
4828
4829 return nullptr;
4830}
4831
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004832} // namespace parameter_validation
4833
4834// vk_layer_logging.h expects these to be defined
4835
4836VKAPI_ATTR VkResult VKAPI_CALL
4837vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4838 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004839 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004840}
4841
4842VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
4843 VkDebugReportCallbackEXT msgCallback,
4844 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004845 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004846}
4847
4848VKAPI_ATTR void VKAPI_CALL
4849vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
4850 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004851 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004852}
4853
4854// loader-layer interface v0
4855
Chia-I Wu99f701c2016-05-13 14:06:08 +08004856VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4857vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004858 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004859}
4860
4861VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4862vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004863 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004864}
4865
4866VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4867vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004868 // the layer command handles VK_NULL_HANDLE just fine internally
4869 assert(physicalDevice == VK_NULL_HANDLE);
4870 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004871}
4872
4873VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4874 const char *pLayerName, uint32_t *pCount,
4875 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004876 // the layer command handles VK_NULL_HANDLE just fine internally
4877 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08004878 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004879}
4880
4881VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004882 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004883}
4884
4885VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004886 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004887}