blob: 2efd8474f18f9c2926b7d3cd5212f9eefddfdb7e [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 Lobodzinskiaf00fa82016-08-09 10:44:38 -060074 bool wsi_enabled;
75
Mark Lobodzinskia4932512016-06-27 15:13:00 -060076 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060077 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060078 physical_device_features{}, physical_device{}, wsi_enabled(false) {};
Cody Northrop55443ef2015-09-28 15:09:32 -060079};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050080
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060081static std::unordered_map<void *, struct instance_extension_enables> instanceExtMap;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070082static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060083static device_table_map pc_device_table_map;
84static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060085
Jeremy Hayes99a96322015-06-26 12:48:09 -060086// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070087debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060088 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060089 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060090#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060091 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 -060092#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060093 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060094
95 return data->report_data;
96}
97
98// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070099debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600100 dispatch_key key = get_dispatch_key(object);
101 layer_data *data = get_my_data_ptr(key, layer_data_map);
102#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -0600103 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 -0600104#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -0600105 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600106 return data->report_data;
107}
108
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600109static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600110
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600111 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600112}
113
Chia-I Wu01ca2372016-05-13 14:37:49 +0800114VKAPI_ATTR VkResult VKAPI_CALL
115CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
116 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700117 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700118 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600119
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700120 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700121 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600122 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600123 }
124
125 return result;
126}
127
Chia-I Wu01ca2372016-05-13 14:37:49 +0800128VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance,
129 VkDebugReportCallbackEXT msgCallback,
130 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700131 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700132 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600133
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700134 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700135 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600136}
137
Chia-I Wu01ca2372016-05-13 14:37:49 +0800138VKAPI_ATTR void VKAPI_CALL
139DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
140 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700141 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
142 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700143}
144
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700145static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600146
Chia-I Wu3384db82016-05-16 07:30:58 +0800147static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600148 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800149};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700150
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700151static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600152 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
154 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
155 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
156 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
157 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 -0700158 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700159 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600160 return false;
161 }
162
163 return true;
164}
165
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
167 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 return "unrecognized enumerator";
169 }
170
171 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600185 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
192 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
195 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600197 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
198 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600200 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
201 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700202 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800203 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600204 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700205 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800206 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600207 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700208 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700209 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
210 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600211
212 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700213 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600214 enumeratorString += string;
215
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600217 enumeratorString += '|';
218 }
219 }
220
221 return enumeratorString;
222}
223
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700224static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
225 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
226 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
227 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
228 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
229 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600230 return false;
231 }
232
233 return true;
234}
235
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700236static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
237 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600238 return "unrecognized enumerator";
239 }
240
241 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700242 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
244 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600246 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600247 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
250 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
253 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600255 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
256 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700257 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800258 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600259 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700260 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600261 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
262 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700263 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800264 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600265 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266
267 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700268 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600269 enumeratorString += string;
270
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600272 enumeratorString += '|';
273 }
274 }
275
276 return enumeratorString;
277}
278
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
280 VkQueueFlagBits allFlags =
281 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
282 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600283 return false;
284 }
285
286 return true;
287}
288
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
290 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600291 return "unrecognized enumerator";
292 }
293
294 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800296 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600297 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700298 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600299 strings.push_back("VK_QUEUE_COMPUTE_BIT");
300 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700301 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800302 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600303 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700304 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
306 }
307
308 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700309 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600310 enumeratorString += string;
311
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600313 enumeratorString += '|';
314 }
315 }
316
317 return enumeratorString;
318}
319
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
321 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
322 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
323 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
324 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600325 return false;
326 }
327
328 return true;
329}
330
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
332 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600333 return "unrecognized enumerator";
334 }
335
336 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600338 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
339 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800341 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600342 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700343 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600344 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
345 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700346 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800347 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600348 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700349 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800350 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600351 }
352
353 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700354 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600355 enumeratorString += string;
356
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 enumeratorString += '|';
359 }
360 }
361
362 return enumeratorString;
363}
364
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700366 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700367 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600368 return false;
369 }
370
371 return true;
372}
373
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700374static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
375 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600376 return "unrecognized enumerator";
377 }
378
379 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700380 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800381 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600382 }
383
384 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700385 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600386 enumeratorString += string;
387
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700388 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600389 enumeratorString += '|';
390 }
391 }
392
393 return enumeratorString;
394}
395
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
397 VkSparseImageFormatFlagBits allFlags =
398 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
399 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
400 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600401 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600402 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600403
404 return true;
405}
406
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
408 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600409 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600410 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411
412 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700413 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800414 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600415 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700416 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800417 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600418 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700419 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800420 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600421 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422
423 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700424 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600425 enumeratorString += string;
426
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 enumeratorString += '|';
429 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600430 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600431
432 return enumeratorString;
433}
434
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700436 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700437 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600438 return false;
439 }
440
441 return true;
442}
443
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700444static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
445 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600446 return "unrecognized enumerator";
447 }
448
449 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700450 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600451 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
452 }
453
454 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700455 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600456 enumeratorString += string;
457
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600459 enumeratorString += '|';
460 }
461 }
462
463 return enumeratorString;
464}
465
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700466static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
467 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
468 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
469 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
470 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
471 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600472 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
473 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
474 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700475 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 return false;
477 }
478
479 return true;
480}
481
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
483 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600484 return "unrecognized enumerator";
485 }
486
487 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_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_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600502 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700504 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600505 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700507 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600508 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700510 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600511 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700512 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700513 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700515 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700516 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600517 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700518 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700519 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600520 }
521
522 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700523 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600524 enumeratorString += string;
525
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600527 enumeratorString += '|';
528 }
529 }
530
531 return enumeratorString;
532}
533
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700534static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
535 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
536 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
537 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600538 return false;
539 }
540
541 return true;
542}
543
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
545 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600546 return "unrecognized enumerator";
547 }
548
549 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600551 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
552 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700553 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600554 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
555 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700556 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600557 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
558 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700559 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600560 strings.push_back("VK_QUERY_RESULT_64_BIT");
561 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600562
563 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700564 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600565 enumeratorString += string;
566
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700567 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600568 enumeratorString += '|';
569 }
570 }
571
572 return enumeratorString;
573}
574
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
576 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
577 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
578 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
579 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
580 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600581 return false;
582 }
583
584 return true;
585}
586
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
588 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600589 return "unrecognized enumerator";
590 }
591
592 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
601 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
604 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
607 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700608 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600610 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700611 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600612 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
613 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700614 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800615 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600616 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700617 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600618 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
619 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620
621 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700622 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600623 enumeratorString += string;
624
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600626 enumeratorString += '|';
627 }
628 }
629
630 return enumeratorString;
631}
632
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700633static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
634 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
635 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
636 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 return false;
638 }
639
640 return true;
641}
642
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
644 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600645 return "unrecognized enumerator";
646 }
647
648 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700649 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600650 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
651 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700652 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600653 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
654 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700655 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600656 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600657 }
658
659 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700660 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600661 enumeratorString += string;
662
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700663 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600664 enumeratorString += '|';
665 }
666 }
667
668 return enumeratorString;
669}
670
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
672 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
673 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
674 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
675 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600676 return false;
677 }
678
679 return true;
680}
681
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
683 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600684 return "unrecognized enumerator";
685 }
686
687 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600689 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
690 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700691 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600692 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
693 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700694 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600695 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
696 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700697 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600698 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
699 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700700 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600701 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600702 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703
704 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700705 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600706 enumeratorString += string;
707
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600709 enumeratorString += '|';
710 }
711 }
712
713 return enumeratorString;
714}
715
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700716static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
717 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
718 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
719 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 return false;
721 }
722
723 return true;
724}
725
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
727 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600728 return "unrecognized enumerator";
729 }
730
731 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700732 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800733 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600734 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700735 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800736 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600737 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700738 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800739 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600740 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700741 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800742 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600743 }
744
745 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700746 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600747 enumeratorString += string;
748
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600750 enumeratorString += '|';
751 }
752 }
753
754 return enumeratorString;
755}
756
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700757static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
758 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
759 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
760 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600761 return false;
762 }
763
764 return true;
765}
766
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700767static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
768 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600769 return "unrecognized enumerator";
770 }
771
772 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700773 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600774 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
775 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600777 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
778 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700779 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600780 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600781 }
782
783 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700784 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600785 enumeratorString += string;
786
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700787 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600788 enumeratorString += '|';
789 }
790 }
791
792 return enumeratorString;
793}
794
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
796 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
797 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
798 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
799 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600800 return false;
801 }
802
803 return true;
804}
805
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
807 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600808 return "unrecognized enumerator";
809 }
810
811 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600814 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600816 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600817 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600819 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
820 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600822 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
823 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700824 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600825 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600826 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700827 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600828 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600829 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700830 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600831 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600832 }
833
834 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700835 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600836 enumeratorString += string;
837
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600839 enumeratorString += '|';
840 }
841 }
842
843 return enumeratorString;
844}
845
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700846static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800847 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
849 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
850 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
851 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
852 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
853 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 -0700854 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700855 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 return false;
857 }
858
859 return true;
860}
861
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
863 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600864 return "unrecognized enumerator";
865 }
866
867 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800869 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800872 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600875 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600881 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700884 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600887 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600893 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600896 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600899 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
900 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600902 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
903 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700905 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600906 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700907 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600908 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
909 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700910 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600911 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
912 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700913 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600914 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
915 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700916 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600917 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600918 }
919
920 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700921 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600922 enumeratorString += string;
923
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600925 enumeratorString += '|';
926 }
927 }
928
929 return enumeratorString;
930}
931
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700932static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800933 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700934 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
935 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
936 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
937 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
938 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 +0800939
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700940 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600941 return false;
942 }
943
944 return true;
945}
946
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700947static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
948 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600949 return "unrecognized enumerator";
950 }
951
952 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600985 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800987 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600988 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800990 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600991 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700992 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800993 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600994 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700995 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800996 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600997 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700998 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800999 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001000 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001001 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001002 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001003 }
1004
1005 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001006 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001007 enumeratorString += string;
1008
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001010 enumeratorString += '|';
1011 }
1012 }
1013
1014 return enumeratorString;
1015}
1016
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1018 VkCommandPoolCreateFlagBits allFlags =
1019 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1020 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001021 return false;
1022 }
1023
1024 return true;
1025}
1026
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001027static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1028 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001029 return "unrecognized enumerator";
1030 }
1031
1032 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001033 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001034 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001035 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001036 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001037 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001038 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039
1040 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001041 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001042 enumeratorString += string;
1043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045 enumeratorString += '|';
1046 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001047 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001048
1049 return enumeratorString;
1050}
1051
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001053 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001054 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001055 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001056 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001057
1058 return true;
1059}
1060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001061static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1062 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001063 return "unrecognized enumerator";
1064 }
1065
1066 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001067 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001068 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001069 }
1070
1071 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001072 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001073 enumeratorString += string;
1074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001075 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001076 enumeratorString += '|';
1077 }
1078 }
1079
1080 return enumeratorString;
1081}
1082
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1084 VkCommandBufferUsageFlags allFlags =
1085 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1086 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1087 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 return false;
1089 }
1090
1091 return true;
1092}
1093
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1095 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001096 return "unrecognized enumerator";
1097 }
1098
1099 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001100 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001101 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001102 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001103 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001104 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001105 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001106 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001107 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001108 }
1109
1110 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001111 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001112 enumeratorString += string;
1113
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 enumeratorString += '|';
1116 }
1117 }
1118
1119 return enumeratorString;
1120}
1121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001123 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001124 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001125 return false;
1126 }
1127
1128 return true;
1129}
1130
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001131static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1132 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001133 return "unrecognized enumerator";
1134 }
1135
1136 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001137 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001138 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001139 }
1140
1141 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001142 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001143 enumeratorString += string;
1144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001146 enumeratorString += '|';
1147 }
1148 }
1149
1150 return enumeratorString;
1151}
1152
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001153static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1154 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1155 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1156 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001157 return false;
1158 }
1159
1160 return true;
1161}
1162
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1164 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001165 return "unrecognized enumerator";
1166 }
1167
1168 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001169 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001172 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001173 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001175 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001176 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001178 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001179 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1180 }
1181
1182 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001183 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001184 enumeratorString += string;
1185
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001187 enumeratorString += '|';
1188 }
1189 }
1190
1191 return enumeratorString;
1192}
1193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001195 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001196 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001197 return false;
1198 }
1199
1200 return true;
1201}
1202
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001203static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1204 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001205 return "unrecognized enumerator";
1206 }
1207
1208 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001209 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001210 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001211 }
1212
1213 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001214 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001215 enumeratorString += string;
1216
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001217 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001218 enumeratorString += '|';
1219 }
1220 }
1221
1222 return enumeratorString;
1223}
1224
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001225static const int MaxParamCheckerStringLength = 256;
1226
Dustin Graves080069b2016-04-05 13:48:15 -06001227static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1228 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001229 assert(apiName != nullptr);
1230 assert(stringName != nullptr);
1231 assert(validateString != nullptr);
1232
Dustin Graves080069b2016-04-05 13:48:15 -06001233 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001234
1235 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1236
1237 if (result == VK_STRING_ERROR_NONE) {
1238 return skipCall;
1239 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001240 skipCall =
1241 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 -06001242 LayerName, "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001243 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001244 skipCall =
1245 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 -06001246 LayerName, "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001247 }
1248 return skipCall;
1249}
1250
Dustin Gravesde628532016-04-21 16:30:17 -06001251static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1252 uint32_t index) {
1253 assert(device_data != nullptr);
1254 debug_report_data *report_data = device_data->report_data;
1255 bool skip_call = false;
1256
1257 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001258 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1259 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001260 } else {
1261 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1262 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1263 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001264 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1265 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001266 function_name, parameter_name, index);
1267 return false;
1268 }
1269 }
1270
1271 return skip_call;
1272}
1273
1274static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1275 const uint32_t count, const uint32_t *indices) {
1276 assert(device_data != nullptr);
1277 debug_report_data *report_data = device_data->report_data;
1278 bool skip_call = false;
1279
1280 if (indices != nullptr) {
1281 for (uint32_t i = 0; i < count; i++) {
1282 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001283 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1284 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001285 } else {
1286 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1287 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1288 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001289 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1290 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001291 function_name, parameter_name, i, indices[i]);
1292 return false;
1293 }
1294 }
1295 }
1296 }
1297
1298 return skip_call;
1299}
1300
Chia-I Wu01ca2372016-05-13 14:37:49 +08001301VKAPI_ATTR VkResult VKAPI_CALL
1302CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001303 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001304
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001305 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001306 assert(chain_info != nullptr);
1307 assert(chain_info->u.pLayerInfo != nullptr);
1308
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001309 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1310 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001311 if (fpCreateInstance == NULL) {
1312 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001313 }
1314
Dustin Graves842621d2016-03-03 14:17:08 -07001315 // Advance the link info for the next element on the chain
1316 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1317
1318 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001319
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001320 if (result == VK_SUCCESS) {
1321 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1322 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001323
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001324 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001325
Chia-I Wua570b7c2016-05-16 07:48:14 +08001326 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001327 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1328 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001329
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001330 // Look for one or more debug report create info structures
1331 // and setup a callback(s) for each one found.
1332 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1333 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1334 if (my_instance_data->num_tmp_callbacks > 0) {
1335 // Setup the temporary callback(s) here to catch early issues:
1336 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1337 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1338 // Failure of setting up one or more of the callback.
1339 // Therefore, clean up and don't use those callbacks:
1340 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1341 my_instance_data->num_tmp_callbacks = 0;
1342 }
1343 }
1344 }
1345
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001346 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001347
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001348 // Ordinarily we'd check these before calling down the chain, but none of the layer
1349 // support is in place until now, if we survive we can report the issue now.
1350 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001351
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001352 if (pCreateInfo->pApplicationInfo) {
1353 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1354 validate_string(my_instance_data->report_data, "vkCreateInstance",
1355 "pCreateInfo->VkApplicationInfo->pApplicationName",
1356 pCreateInfo->pApplicationInfo->pApplicationName);
1357 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001358
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001359 if (pCreateInfo->pApplicationInfo->pEngineName) {
1360 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1361 pCreateInfo->pApplicationInfo->pEngineName);
1362 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001363 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001364
1365 // Disable the tmp callbacks:
1366 if (my_instance_data->num_tmp_callbacks > 0) {
1367 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1368 my_instance_data->tmp_callbacks);
1369 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001370 }
1371
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001372 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001373}
1374
Chia-I Wu01ca2372016-05-13 14:37:49 +08001375VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001376 // Grab the key before the instance is destroyed.
1377 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001378 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001379 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001380 assert(my_data != NULL);
1381
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001382 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1383 bool callback_setup = false;
1384 if (my_data->num_tmp_callbacks > 0) {
1385 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1386 my_data->tmp_callbacks)) {
1387 callback_setup = true;
1388 }
1389 }
1390
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001391 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001392
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001393 // Disable and cleanup the temporary callback(s):
1394 if (callback_setup) {
1395 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1396 }
1397 if (my_data->num_tmp_callbacks > 0) {
1398 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1399 my_data->num_tmp_callbacks = 0;
1400 }
1401
Dustin Graves080069b2016-04-05 13:48:15 -06001402 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001403 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001404 pTable->DestroyInstance(instance, pAllocator);
1405
1406 // Clean up logging callback, if any
1407 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1409 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001410 my_data->logging_callback.pop_back();
1411 }
1412
1413 layer_debug_report_destroy_instance(mid(instance));
1414 layer_data_map.erase(pTable);
1415
1416 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001417 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001418 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001419}
1420
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001421VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1422 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001423 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001424 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001426 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001427
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001428 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001429
Dustin Graves080069b2016-04-05 13:48:15 -06001430 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001431 result = get_dispatch_table(pc_instance_table_map, instance)
1432 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001434 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001435 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1436 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1437 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1438 // Save the supported features for each physical device
1439 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1440 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1441 }
1442 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001443 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001444 return result;
1445}
1446
Chia-I Wu01ca2372016-05-13 14:37:49 +08001447VKAPI_ATTR void VKAPI_CALL
1448GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001449 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001450 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001451 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001452
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001453 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454
Dustin Graves080069b2016-04-05 13:48:15 -06001455 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001456 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001457 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001458}
1459
Chia-I Wu01ca2372016-05-13 14:37:49 +08001460VKAPI_ATTR void VKAPI_CALL
1461GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001462 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001463 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001465
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001466 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001467
Dustin Graves080069b2016-04-05 13:48:15 -06001468 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001469 get_dispatch_table(pc_instance_table_map, physicalDevice)
1470 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001472}
1473
Chia-I Wu01ca2372016-05-13 14:37:49 +08001474VKAPI_ATTR VkResult VKAPI_CALL
1475GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1476 VkImageUsageFlags usage, VkImageCreateFlags flags,
1477 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001478 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001479 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001480 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001481 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001482
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001483 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001484 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485
Dustin Graves080069b2016-04-05 13:48:15 -06001486 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001487 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1488 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1489 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001491 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001492 }
Chia-I Wu17241042015-10-31 00:31:16 +08001493
1494 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001495}
1496
Chia-I Wu01ca2372016-05-13 14:37:49 +08001497VKAPI_ATTR void VKAPI_CALL
1498GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001499 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001500 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001502
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001503 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504
Dustin Graves080069b2016-04-05 13:48:15 -06001505 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001506 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001507 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001508}
1509
Chia-I Wu01ca2372016-05-13 14:37:49 +08001510VKAPI_ATTR void VKAPI_CALL
1511GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1512 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001513 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001514 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001515 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001516
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001517 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001519
Dustin Graves080069b2016-04-05 13:48:15 -06001520 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001521 get_dispatch_table(pc_instance_table_map, physicalDevice)
1522 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001523 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001524}
1525
Chia-I Wu01ca2372016-05-13 14:37:49 +08001526VKAPI_ATTR void VKAPI_CALL
1527GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001528 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001529 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001530 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001531
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001532 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001533
Dustin Graves080069b2016-04-05 13:48:15 -06001534 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001535 get_dispatch_table(pc_instance_table_map, physicalDevice)
1536 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001537 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001538}
1539
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001540void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1541 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001542 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001543
1544 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1545 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1546 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001547 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 -06001548 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001549 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1550 "structure.",
1551 i);
1552 } else {
1553 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001554 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001555
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001556 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1557 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1558 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1559 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001560 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 -06001561 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001562 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1563 "between 0 and 1. Actual value is %f",
1564 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1565 }
1566 }
1567 }
1568
1569 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1570 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001571 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001572 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001573 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1574 "of queue families.",
1575 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001576 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1577 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1578 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001579 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001580 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001581 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1582 "queues for the given family index.",
1583 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001584 }
Michael Lentine774704f2016-01-27 13:36:46 -06001585 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001586 }
1587}
1588
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001589static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
1590 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(pc_instance_table_map, instance);
1591
1592 instanceExtMap[pDisp] = {};
1593
1594 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1595 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1596 instanceExtMap[pDisp].wsi_enabled = true;
1597 }
1598#ifdef VK_USE_PLATFORM_XLIB_KHR
1599 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
1600 instanceExtMap[pDisp].xlib_enabled = true;
1601 }
1602#endif
1603#ifdef VK_USE_PLATFORM_XCB_KHR
1604 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
1605 instanceExtMap[pDisp].xcb_enabled = true;
1606 }
1607#endif
1608#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1609 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
1610 instanceExtMap[pDisp].wayland_enabled = true;
1611 }
1612#endif
1613#ifdef VK_USE_PLATFORM_MIR_KHR
1614 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
1615 instanceExtMap[pDisp].mir_enabled = true;
1616 }
1617#endif
1618#ifdef VK_USE_PLATFORM_ANDROID_KHR
1619 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
1620 instanceExtMap[pDisp].android_enabled = true;
1621 }
1622#endif
1623#ifdef VK_USE_PLATFORM_WIN32_KHR
1624 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
1625 instanceExtMap[pDisp].win32_enabled = true;
1626 }
1627#endif
1628 }
1629}
1630
1631static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1632 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1633 device_data->wsi_enabled = false;
1634
1635 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1636 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1637 device_data->wsi_enabled = true;
1638 }
1639 }
1640}
1641
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001642void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001643 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001644
1645 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1646 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1647 my_device_data->queueFamilyIndexMap.insert(
1648 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1649 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001650 }
1651}
1652
Chia-I Wu01ca2372016-05-13 14:37:49 +08001653VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice,
1654 const VkDeviceCreateInfo *pCreateInfo,
1655 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001656 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001657 * NOTE: We do not validate physicalDevice or any dispatchable
1658 * object as the first parameter. We couldn't get here if it was wrong!
1659 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001660
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001661 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001662 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001663 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001664 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001665
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001666 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001667
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001668 if (pCreateInfo != NULL) {
1669 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001670 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001671 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1672 pCreateInfo->ppEnabledLayerNames[i]);
1673 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001674 }
Michael Lentine774704f2016-01-27 13:36:46 -06001675
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001676 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001677 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001678 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1679 pCreateInfo->ppEnabledExtensionNames[i]);
1680 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001681 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001682 }
1683
Dustin Graves080069b2016-04-05 13:48:15 -06001684 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001685 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001686 assert(chain_info != nullptr);
1687 assert(chain_info->u.pLayerInfo != nullptr);
1688
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001689 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1690 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001691 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001692 if (fpCreateDevice == NULL) {
1693 return VK_ERROR_INITIALIZATION_FAILED;
1694 }
1695
1696 // Advance the link info for the next element on the chain
1697 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1698
1699 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001700
1701 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1702
1703 if (result == VK_SUCCESS) {
1704 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1705 assert(my_device_data != nullptr);
1706
1707 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1708 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1709
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001710 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1711
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001712 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001713 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1714 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001715 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001716 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001717
1718 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1719 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001720
1721 // Query and save physical device limits for this device
1722 VkPhysicalDeviceProperties device_properties = {};
1723 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1724 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001725 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001726
1727 // Save app-enabled features in this device's layer_data structure
1728 if (pCreateInfo->pEnabledFeatures) {
1729 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1730 } else {
1731 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1732 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001733 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001734 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001735
Jeremy Hayes99a96322015-06-26 12:48:09 -06001736 return result;
1737}
1738
Chia-I Wu01ca2372016-05-13 14:37:49 +08001739VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001740 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001741 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001742 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1743 assert(my_data != NULL);
1744
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001745 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001746
Dustin Graves080069b2016-04-05 13:48:15 -06001747 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001748 layer_debug_report_destroy_device(device);
1749
Jeremy Hayes99a96322015-06-26 12:48:09 -06001750#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001751 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001752#endif
1753
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001754 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001755 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001756 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001757 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758}
1759
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001760bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001761 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001762 assert(my_device_data != nullptr);
1763
Dustin Gravesde628532016-04-21 16:30:17 -06001764 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001765
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001766 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001767 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001768 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 -06001769 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001770 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1771 "was created.",
1772 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001773 return false;
1774 }
1775 return true;
1776}
1777
Chia-I Wu01ca2372016-05-13 14:37:49 +08001778VKAPI_ATTR void VKAPI_CALL
1779GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001780 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001781 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001782 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001783
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001784 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001785
Dustin Graves080069b2016-04-05 13:48:15 -06001786 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001787 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1788
1789 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001790 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001791}
1792
Chia-I Wu01ca2372016-05-13 14:37:49 +08001793VKAPI_ATTR VkResult VKAPI_CALL
1794QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001795 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001796 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001798 assert(my_data != NULL);
1799
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001800 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001801
Dustin Graves080069b2016-04-05 13:48:15 -06001802 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001803 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1804
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001805 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001806 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001807
Jeremy Hayes99a96322015-06-26 12:48:09 -06001808 return result;
1809}
1810
Chia-I Wu01ca2372016-05-13 14:37:49 +08001811VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001812 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1813 assert(my_data != NULL);
1814
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001815 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001816
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001817 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001818
1819 return result;
1820}
1821
Chia-I Wu01ca2372016-05-13 14:37:49 +08001822VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001823 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1824 assert(my_data != NULL);
1825
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001826 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001827
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001828 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001829
1830 return result;
1831}
1832
Chia-I Wu01ca2372016-05-13 14:37:49 +08001833VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001834 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1835 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001836 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001837 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001838 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001839
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001840 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001841
Dustin Graves080069b2016-04-05 13:48:15 -06001842 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001843 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1844
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001845 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001846 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001847
1848 return result;
1849}
1850
Chia-I Wu01ca2372016-05-13 14:37:49 +08001851VKAPI_ATTR void VKAPI_CALL
1852FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001853 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001854 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001855 assert(my_data != NULL);
1856
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001857 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001858
Dustin Graves080069b2016-04-05 13:48:15 -06001859 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001860 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001861 }
1862}
1863
Chia-I Wu01ca2372016-05-13 14:37:49 +08001864VKAPI_ATTR VkResult VKAPI_CALL
1865MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001866 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001867 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001868 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001869 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001870
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001871 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872
Dustin Graves080069b2016-04-05 13:48:15 -06001873 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001874 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1875
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001876 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001878
1879 return result;
1880}
1881
Chia-I Wu01ca2372016-05-13 14:37:49 +08001882VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001883 bool skipCall = false;
1884 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1885 assert(my_data != NULL);
1886
1887 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1888
1889 if (!skipCall) {
1890 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1891 }
1892}
1893
Chia-I Wu01ca2372016-05-13 14:37:49 +08001894VKAPI_ATTR VkResult VKAPI_CALL
1895FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001896 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001897 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001898 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001900
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001901 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001902
Dustin Graves080069b2016-04-05 13:48:15 -06001903 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001904 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1905
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001906 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001908
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001909 return result;
1910}
1911
Chia-I Wu01ca2372016-05-13 14:37:49 +08001912VKAPI_ATTR VkResult VKAPI_CALL
1913InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001914 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001915 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001916 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001918
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001919 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001920
Dustin Graves080069b2016-04-05 13:48:15 -06001921 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001922 result =
1923 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001924
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001925 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001926 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001927
Tony Barbourb1250542015-04-16 19:23:13 -06001928 return result;
1929}
1930
Chia-I Wu01ca2372016-05-13 14:37:49 +08001931VKAPI_ATTR void VKAPI_CALL
1932GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001933 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001934 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001935 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001936
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001937 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001938
Dustin Graves080069b2016-04-05 13:48:15 -06001939 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001940 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001941 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001942}
1943
Chia-I Wu01ca2372016-05-13 14:37:49 +08001944VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1945 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001946 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1947 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001948 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1949 assert(my_data != NULL);
1950
Dustin Graves20fd66f2016-04-18 18:33:21 -06001951 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001952
Dustin Graves20fd66f2016-04-18 18:33:21 -06001953 if (!skipCall) {
1954 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1955
1956 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1957 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001958
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001959 return result;
1960}
1961
Chia-I Wu01ca2372016-05-13 14:37:49 +08001962VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1963 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001964 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1965 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001966 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1967 assert(my_data != NULL);
1968
Dustin Graves20fd66f2016-04-18 18:33:21 -06001969 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001970
Dustin Graves20fd66f2016-04-18 18:33:21 -06001971 if (!skipCall) {
1972 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1973
1974 validate_result(my_data->report_data, "vkBindImageMemory", result);
1975 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001976
1977 return result;
1978}
1979
Chia-I Wu01ca2372016-05-13 14:37:49 +08001980VKAPI_ATTR void VKAPI_CALL
1981GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001982 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001983 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001984 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001985
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001986 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001987
Dustin Graves080069b2016-04-05 13:48:15 -06001988 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001989 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001990 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001991}
1992
Chia-I Wu01ca2372016-05-13 14:37:49 +08001993VKAPI_ATTR void VKAPI_CALL
1994GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001995 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001997 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001998
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001999 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002000
Dustin Graves080069b2016-04-05 13:48:15 -06002001 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002002 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002003 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002004}
2005
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2007 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2008 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002009 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002010 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2011 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002012 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 -06002013 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002014 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2015 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002016 return false;
2017 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002018 }
2019
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020 return true;
2021}
2022
Chia-I Wu01ca2372016-05-13 14:37:49 +08002023VKAPI_ATTR void VKAPI_CALL
2024GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2025 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06002026 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002027 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002028 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002029
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002030 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002031 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002032
Dustin Graves080069b2016-04-05 13:48:15 -06002033 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034 get_dispatch_table(pc_device_table_map, device)
2035 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002036
2037 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2038 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002039}
2040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002041bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2042 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2043 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044 if (pProperties != nullptr) {
2045 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2046 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002047 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 -06002048 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002049 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2050 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002051 return false;
2052 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002053 }
2054
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002055 return true;
2056}
2057
Chia-I Wu01ca2372016-05-13 14:37:49 +08002058VKAPI_ATTR void VKAPI_CALL
2059GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2060 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2061 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06002062 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002063 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002064 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002065
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002066 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002067 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002068
Dustin Graves080069b2016-04-05 13:48:15 -06002069 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070 get_dispatch_table(pc_instance_table_map, physicalDevice)
2071 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2072 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002073
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002074 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2075 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002076 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002077}
2078
Chia-I Wu01ca2372016-05-13 14:37:49 +08002079VKAPI_ATTR VkResult VKAPI_CALL
2080QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002081 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002082 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002083 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002084 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002085
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002086 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002087
Dustin Graves080069b2016-04-05 13:48:15 -06002088 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002089 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2090
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002091 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002092 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002093
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002094 return result;
2095}
2096
Chia-I Wu01ca2372016-05-13 14:37:49 +08002097VKAPI_ATTR VkResult VKAPI_CALL
2098CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002099 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002100 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002102 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002103
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002104 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002105
Dustin Graves080069b2016-04-05 13:48:15 -06002106 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002107 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2108
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002109 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002110 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002111
2112 return result;
2113}
2114
Chia-I Wu01ca2372016-05-13 14:37:49 +08002115VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002116 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002117 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002118 assert(my_data != NULL);
2119
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002120 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002121
Dustin Graves080069b2016-04-05 13:48:15 -06002122 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002123 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002124 }
2125}
2126
Chia-I Wu01ca2372016-05-13 14:37:49 +08002127VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002128 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002129 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002130 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002131 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002132
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002133 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002134
Dustin Graves080069b2016-04-05 13:48:15 -06002135 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002136 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2137
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002138 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002139 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002140
2141 return result;
2142}
2143
Chia-I Wu01ca2372016-05-13 14:37:49 +08002144VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002145 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2146 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002147 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2148 assert(my_data != NULL);
2149
Dustin Graves20fd66f2016-04-18 18:33:21 -06002150 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002151
Dustin Graves20fd66f2016-04-18 18:33:21 -06002152 if (!skipCall) {
2153 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2154
2155 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2156 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002157
2158 return result;
2159}
2160
Chia-I Wu01ca2372016-05-13 14:37:49 +08002161VKAPI_ATTR VkResult VKAPI_CALL
2162WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002163 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002164 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002165 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002166 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002167
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002168 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002169
Dustin Graves080069b2016-04-05 13:48:15 -06002170 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002171 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2172
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002173 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002174 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002175
2176 return result;
2177}
2178
Chia-I Wu01ca2372016-05-13 14:37:49 +08002179VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002180 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2181 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002182 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002183 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002184 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002185
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002186 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002187
Dustin Graves080069b2016-04-05 13:48:15 -06002188 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002189 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2190
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002191 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002192 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002193
2194 return result;
2195}
2196
Chia-I Wu01ca2372016-05-13 14:37:49 +08002197VKAPI_ATTR void VKAPI_CALL
2198DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002199 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002201 assert(my_data != NULL);
2202
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002203 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002204
Dustin Graves080069b2016-04-05 13:48:15 -06002205 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002206 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002207 }
2208}
2209
Chia-I Wu01ca2372016-05-13 14:37:49 +08002210VKAPI_ATTR VkResult VKAPI_CALL
2211CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002212 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002213 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002214 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002215 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002216
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002217 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002218
Dustin Graves080069b2016-04-05 13:48:15 -06002219 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002220 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2221
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002222 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002224
2225 return result;
2226}
2227
Chia-I Wu01ca2372016-05-13 14:37:49 +08002228VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002229 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002231 assert(my_data != NULL);
2232
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002233 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002234
Dustin Graves080069b2016-04-05 13:48:15 -06002235 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002236 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002237 }
2238}
2239
Chia-I Wu01ca2372016-05-13 14:37:49 +08002240VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002241 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2242 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002243 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2244 assert(my_data != NULL);
2245
Dustin Graves20fd66f2016-04-18 18:33:21 -06002246 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002247
Dustin Graves20fd66f2016-04-18 18:33:21 -06002248 if (!skipCall) {
2249 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2250
2251 validate_result(my_data->report_data, "vkGetEventStatus", result);
2252 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002253
2254 return result;
2255}
2256
Chia-I Wu01ca2372016-05-13 14:37:49 +08002257VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002258 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2259 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2261 assert(my_data != NULL);
2262
Dustin Graves20fd66f2016-04-18 18:33:21 -06002263 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002264
Dustin Graves20fd66f2016-04-18 18:33:21 -06002265 if (!skipCall) {
2266 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2267
2268 validate_result(my_data->report_data, "vkSetEvent", result);
2269 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002270
2271 return result;
2272}
2273
Chia-I Wu01ca2372016-05-13 14:37:49 +08002274VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002275 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2276 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002277 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2278 assert(my_data != NULL);
2279
Dustin Graves20fd66f2016-04-18 18:33:21 -06002280 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002281
Dustin Graves20fd66f2016-04-18 18:33:21 -06002282 if (!skipCall) {
2283 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2284
2285 validate_result(my_data->report_data, "vkResetEvent", result);
2286 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002287
2288 return result;
2289}
2290
Chia-I Wu01ca2372016-05-13 14:37:49 +08002291VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2292 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002293 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002294 bool skip_call = false;
2295 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2296 assert(device_data != nullptr);
2297 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002298
Dustin Gravesc900f572016-05-16 11:07:59 -06002299 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002300
Dustin Gravesc900f572016-05-16 11:07:59 -06002301 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2302 if (pCreateInfo != nullptr) {
2303 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2304 // VkQueryPipelineStatisticFlagBits values
2305 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2306 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2307 skip_call |=
2308 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2309 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2310 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2311 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2312 }
2313 }
2314
2315 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2317
Dustin Gravesc900f572016-05-16 11:07:59 -06002318 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002319 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002320
2321 return result;
2322}
2323
Chia-I Wu01ca2372016-05-13 14:37:49 +08002324VKAPI_ATTR void VKAPI_CALL
2325DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002326 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002328 assert(my_data != NULL);
2329
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002330 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002331
Dustin Graves080069b2016-04-05 13:48:15 -06002332 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002333 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002334 }
2335}
2336
Chia-I Wu01ca2372016-05-13 14:37:49 +08002337VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2338 uint32_t queryCount, size_t dataSize, void *pData,
2339 VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002341 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002342 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002343 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002344
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002345 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002346 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002347
Dustin Graves080069b2016-04-05 13:48:15 -06002348 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002349 result = get_dispatch_table(pc_device_table_map, device)
2350 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002351
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002352 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002353 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002354
2355 return result;
2356}
2357
Chia-I Wu01ca2372016-05-13 14:37:49 +08002358VKAPI_ATTR VkResult VKAPI_CALL
2359CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002360 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002361 bool skip_call = false;
2362 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2363 assert(device_data != nullptr);
2364 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002365
Dustin Gravesc900f572016-05-16 11:07:59 -06002366 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002367
Dustin Gravesc900f572016-05-16 11:07:59 -06002368 if (pCreateInfo != nullptr) {
2369 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2370 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2371 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2372 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2373 skip_call |=
2374 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2375 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2376 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2377 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002378
Dustin Gravesc900f572016-05-16 11:07:59 -06002379 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2380 // queueFamilyIndexCount uint32_t values
2381 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2382 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2383 __LINE__, REQUIRED_PARAMETER, LayerName,
2384 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2385 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2386 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2387 }
2388
2389 // Ensure that the queue family indices were specified at device creation
2390 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2391 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2392 }
2393 }
2394
2395 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002396 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2397
Dustin Gravesc900f572016-05-16 11:07:59 -06002398 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002399 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002400
2401 return result;
2402}
2403
Chia-I Wu01ca2372016-05-13 14:37:49 +08002404VKAPI_ATTR void VKAPI_CALL
2405DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002406 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002407 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002408 assert(my_data != NULL);
2409
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002410 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002411
Dustin Graves080069b2016-04-05 13:48:15 -06002412 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002413 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002414 }
2415}
2416
Chia-I Wu01ca2372016-05-13 14:37:49 +08002417VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2418 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002419 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002420 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002421 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002422 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002423
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002424 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002425
Dustin Graves080069b2016-04-05 13:48:15 -06002426 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002427 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2428
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002429 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002431
2432 return result;
2433}
2434
Chia-I Wu01ca2372016-05-13 14:37:49 +08002435VKAPI_ATTR void VKAPI_CALL
2436DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002437 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002439 assert(my_data != NULL);
2440
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002441 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002442
Dustin Graves080069b2016-04-05 13:48:15 -06002443 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002444 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002445 }
2446}
2447
Chia-I Wu01ca2372016-05-13 14:37:49 +08002448VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2449 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002450 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2451 bool skip_call = false;
2452 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002453 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002454 debug_report_data *report_data = device_data->report_data;
2455
2456 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2457
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002458 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002459 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002460 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002461 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2462 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2463 skip_call |=
2464 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2465 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2466 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2467 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002468
Dustin Gravesc900f572016-05-16 11:07:59 -06002469 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2470 // queueFamilyIndexCount uint32_t values
2471 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2472 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2473 __LINE__, REQUIRED_PARAMETER, LayerName,
2474 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2475 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2476 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2477 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478
2479 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2480 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2481 }
2482
2483 // width, height, and depth members of extent must be greater than 0
2484 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2485 0u);
2486 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2487 0u);
2488 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2489 0u);
2490
2491 // mipLevels must be greater than 0
2492 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2493 0u);
2494
2495 // arrayLayers must be greater than 0
2496 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2497 0u);
2498
2499 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2500 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2501 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2502 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002503 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002504 }
2505
2506 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2507 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2508 // extent.height must be equal
2509 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2510 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002511 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2512 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2513 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2514 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002515 }
2516
2517 if (pCreateInfo->extent.depth != 1) {
2518 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002519 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002520 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2521 }
2522 }
2523
2524 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2525 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2526 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2527 skip_call |= log_msg(
2528 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2529 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2530 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2531 }
2532
2533 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2534 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2535 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2536 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2537 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2538 LayerName,
2539 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2540 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002541 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002542 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002543
Dustin Gravesf8032f22016-05-11 18:31:44 -06002544 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002545 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2546
Dustin Gravesf8032f22016-05-11 18:31:44 -06002547 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002548 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002549
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002550 return result;
2551}
2552
Chia-I Wu01ca2372016-05-13 14:37:49 +08002553VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002554 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002555 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002556 assert(my_data != NULL);
2557
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002558 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002559
Dustin Graves080069b2016-04-05 13:48:15 -06002560 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002561 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002562 }
2563}
2564
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002565bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2566 if (pSubresource != nullptr) {
2567 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2568 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002569 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 -06002570 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002571 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2572 return false;
2573 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002574 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002575
2576 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002577}
2578
Chia-I Wu01ca2372016-05-13 14:37:49 +08002579VKAPI_ATTR void VKAPI_CALL
2580GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002581 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002582 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002583 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002584
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002585 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002586
Dustin Graves080069b2016-04-05 13:48:15 -06002587 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002588 PreGetImageSubresourceLayout(device, pSubresource);
2589
2590 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002591 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002592}
2593
Chia-I Wu01ca2372016-05-13 14:37:49 +08002594VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2595 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002596 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002597 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002598 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002599 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002600 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002601
Dustin Graves0b70a632016-04-27 17:44:56 -06002602 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002603
Dustin Graves0b70a632016-04-27 17:44:56 -06002604 if (pCreateInfo != nullptr) {
2605 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002606 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2607 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002608 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2609 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2610 "pCreateInfo->subresourceRange.layerCount must be 1",
2611 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2612 }
2613 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002614 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2615 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2616 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002617 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2618 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2619 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2620 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2621 }
2622 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002623 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2624 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002625 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2626 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2627 "pCreateInfo->subresourceRange.layerCount must be 6");
2628 }
2629 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002630 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2631 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002632 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2633 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2634 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2635 }
2636 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2637 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2638 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2639 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2640 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2641 }
2642
Dustin Graves2a80dc62016-07-12 13:57:02 -06002643 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2644 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002645 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2646 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2647 "pCreateInfo->subresourceRange.layerCount must be 1");
2648 }
2649 }
2650 }
2651
2652 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002653 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2654
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002655 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002656 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002657
2658 return result;
2659}
2660
Chia-I Wu01ca2372016-05-13 14:37:49 +08002661VKAPI_ATTR void VKAPI_CALL
2662DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002663 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002664 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002665 assert(my_data != NULL);
2666
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002667 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002668
Dustin Graves080069b2016-04-05 13:48:15 -06002669 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002670 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002671 }
2672}
2673
Chia-I Wu01ca2372016-05-13 14:37:49 +08002674VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2675 const VkAllocationCallbacks *pAllocator,
2676 VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002677 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002678 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002679 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002680 assert(my_data != NULL);
2681
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002682 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002683
Dustin Graves080069b2016-04-05 13:48:15 -06002684 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002685 result =
2686 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002687
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002688 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002689 }
2690
Michael Lentine03d8e572015-09-15 14:59:14 -05002691 return result;
2692}
2693
Chia-I Wu01ca2372016-05-13 14:37:49 +08002694VKAPI_ATTR void VKAPI_CALL
2695DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002696 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002697 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002698 assert(my_data != NULL);
2699
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002700 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002701
Dustin Graves080069b2016-04-05 13:48:15 -06002702 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002703 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002704 }
2705}
2706
Chia-I Wu01ca2372016-05-13 14:37:49 +08002707VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2708 const VkAllocationCallbacks *pAllocator,
2709 VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002710 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002711 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002713 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002714
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002715 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002716
Dustin Graves080069b2016-04-05 13:48:15 -06002717 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002718 result =
2719 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002720
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002721 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002722 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002723
2724 return result;
2725}
2726
Chia-I Wu01ca2372016-05-13 14:37:49 +08002727VKAPI_ATTR void VKAPI_CALL
2728DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002729 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002730 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002731 assert(my_data != NULL);
2732
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002733 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002734
Dustin Graves080069b2016-04-05 13:48:15 -06002735 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002736 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002737 }
2738}
2739
Chia-I Wu01ca2372016-05-13 14:37:49 +08002740VKAPI_ATTR VkResult VKAPI_CALL
2741GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002742 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002743 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002744 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002745 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002746
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002747 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002748
Dustin Graves080069b2016-04-05 13:48:15 -06002749 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002750 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2751
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002752 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002753 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002754
2755 return result;
2756}
2757
Chia-I Wu01ca2372016-05-13 14:37:49 +08002758VKAPI_ATTR VkResult VKAPI_CALL
2759MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002760 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002761 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002763 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002764
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002765 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002766
Dustin Graves080069b2016-04-05 13:48:15 -06002767 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002768 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2769
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002770 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002771 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002772
2773 return result;
2774}
2775
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002776bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002777 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2778
2779 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002780 if (pCreateInfos != nullptr) {
2781 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2782 if (pCreateInfos->basePipelineIndex != -1) {
2783 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002784 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 -06002785 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002786 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2787 "pCreateInfos->flags "
2788 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2789 return false;
2790 }
2791 }
2792
2793 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2794 if (pCreateInfos->basePipelineIndex != -1) {
2795 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002796 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002797 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002798 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2799 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2800 "VK_NULL_HANDLE");
2801 return false;
2802 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002803 }
2804 }
2805
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002806 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002807 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002808 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 -06002809 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002810 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2811 "unrecognized enumerator");
2812 return false;
2813 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002814 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002815
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002816 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002817 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002818 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002819 pCreateInfos[i].pStages[j].pName);
2820 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002821 }
2822
2823 return true;
2824}
2825
Chia-I Wu01ca2372016-05-13 14:37:49 +08002826VKAPI_ATTR VkResult VKAPI_CALL
2827CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2828 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2829 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002830 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002831 bool skip_call = false;
2832 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2833 assert(device_data != nullptr);
2834 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002835
Dustin Gravesc900f572016-05-16 11:07:59 -06002836 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2837 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002838
Dustin Gravesc900f572016-05-16 11:07:59 -06002839 if (pCreateInfos != nullptr) {
2840 for (uint32_t i = 0; i < createInfoCount; ++i) {
2841 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2842 if (pCreateInfos[i].pTessellationState == nullptr) {
2843 if (pCreateInfos[i].pStages != nullptr) {
2844 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2845 // pTessellationState must not be NULL
2846 bool has_control = false;
2847 bool has_eval = false;
2848
2849 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2850 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2851 has_control = true;
2852 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2853 has_eval = true;
2854 }
2855 }
2856
2857 if (has_control && has_eval) {
2858 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2859 __LINE__, REQUIRED_PARAMETER, LayerName,
2860 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2861 "control shader stage and a tessellation evaluation shader stage, "
2862 "pCreateInfos[%d].pTessellationState must not be NULL",
2863 i, i);
2864 }
2865 }
Dustin Graves629259b2016-05-30 16:14:27 -06002866 } else {
2867 skip_call |=
2868 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002869 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002870
2871 skip_call |=
2872 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2873 pCreateInfos[i].pTessellationState->flags);
2874
2875 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2876 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2877 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2878 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2879 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2880 i);
2881 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002882 }
2883
2884 if (pCreateInfos[i].pViewportState == nullptr) {
2885 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2886 // valid VkPipelineViewportStateCreateInfo structure
2887 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2888 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2889 skip_call |= log_msg(
2890 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2891 REQUIRED_PARAMETER, LayerName,
2892 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2893 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2894 i, i);
2895 }
2896 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002897 skip_call |=
2898 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002899 pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002900
2901 skip_call |=
2902 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2903 pCreateInfos[i].pViewportState->flags);
2904
Dustin Gravesc900f572016-05-16 11:07:59 -06002905 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2906 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2907 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2908 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2909 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2910 i);
2911 }
2912
2913 if (pCreateInfos[i].pDynamicState != nullptr) {
2914 bool has_dynamic_viewport = false;
2915 bool has_dynamic_scissor = false;
2916
2917 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2918 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2919 has_dynamic_viewport = true;
2920 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2921 has_dynamic_scissor = true;
2922 }
2923 }
2924
2925 // viewportCount must be greater than 0
2926 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2927 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2928 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2929 __LINE__, REQUIRED_PARAMETER, LayerName,
2930 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2931 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2932 "must be greater than 0",
2933 i, i);
2934 }
2935
2936 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2937 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2938 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2939 skip_call |=
2940 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2941 __LINE__, REQUIRED_PARAMETER, LayerName,
2942 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2943 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2944 i, i);
2945 }
2946
2947 // scissorCount must be greater than 0
2948 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2949 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2950 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2951 __LINE__, REQUIRED_PARAMETER, LayerName,
2952 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2953 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2954 "must be greater than 0",
2955 i, i);
2956 }
2957
2958 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2959 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2960 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2961 skip_call |=
2962 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2963 __LINE__, REQUIRED_PARAMETER, LayerName,
2964 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2965 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2966 i, i);
2967 }
2968 }
2969 }
2970
2971 if (pCreateInfos[i].pMultisampleState == nullptr) {
2972 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2973 // a valid VkPipelineMultisampleStateCreateInfo structure
2974 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2975 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2976 skip_call |=
2977 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2978 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2979 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2980 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2981 i, i);
2982 }
Dustin Graves629259b2016-05-30 16:14:27 -06002983 } else {
2984 skip_call |=
2985 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002986 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002987
2988 skip_call |=
2989 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2990 pCreateInfos[i].pMultisampleState->flags);
2991
2992 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2993 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2994 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2995
2996 skip_call |= validate_array(
2997 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2998 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2999 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
3000
3001 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3002 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
3003 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
3004
3005 skip_call |=
3006 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
3007 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
3008
3009 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3010 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3011 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3012 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3013 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3014 i);
3015 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003016 }
3017
3018 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003019 if (pCreateInfos[i].pDepthStencilState != nullptr) {
3020 skip_call |=
3021 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003022 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003023
3024 skip_call |=
3025 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
3026 pCreateInfos[i].pDepthStencilState->flags);
3027
3028 skip_call |=
3029 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
3030 pCreateInfos[i].pDepthStencilState->depthTestEnable);
3031
3032 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3033 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
3034 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
3035
3036 skip_call |= validate_ranged_enum(
3037 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
3038 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
3039
3040 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3041 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
3042 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
3043
3044 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3045 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
3046 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
3047
3048 skip_call |= validate_ranged_enum(
3049 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
3050 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
3051
3052 skip_call |= validate_ranged_enum(
3053 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
3054 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
3055
3056 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3057 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
3058 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3059 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
3060
3061 skip_call |= validate_ranged_enum(
3062 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
3063 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
3064
3065 skip_call |= validate_ranged_enum(
3066 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
3067 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3068
3069 skip_call |= validate_ranged_enum(
3070 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
3071 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3072
3073 skip_call |= validate_ranged_enum(
3074 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
3075 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3076
3077 skip_call |= validate_ranged_enum(
3078 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3079 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3080
3081 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3082 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3083 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3084 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3085 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3086 i);
3087 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003088 }
3089
3090 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3091 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003092 skip_call |=
3093 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003094 pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003095
3096 skip_call |=
3097 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3098 pCreateInfos[i].pColorBlendState->flags);
3099
3100 skip_call |=
3101 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3102 pCreateInfos[i].pColorBlendState->logicOpEnable);
3103
3104 skip_call |= validate_array(
3105 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3106 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3107 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3108
3109 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3110 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3111 ++attachmentIndex) {
3112 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3113 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3114 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3115
3116 skip_call |= validate_ranged_enum(
3117 report_data, "vkCreateGraphicsPipelines",
3118 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3119 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3120 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3121
3122 skip_call |= validate_ranged_enum(
3123 report_data, "vkCreateGraphicsPipelines",
3124 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3125 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3126 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3127
3128 skip_call |= validate_ranged_enum(
3129 report_data, "vkCreateGraphicsPipelines",
3130 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3131 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3132
3133 skip_call |= validate_ranged_enum(
3134 report_data, "vkCreateGraphicsPipelines",
3135 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3136 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3137 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3138
3139 skip_call |= validate_ranged_enum(
3140 report_data, "vkCreateGraphicsPipelines",
3141 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3142 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3143 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3144
3145 skip_call |= validate_ranged_enum(
3146 report_data, "vkCreateGraphicsPipelines",
3147 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3148 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3149
3150 skip_call |=
3151 validate_flags(report_data, "vkCreateGraphicsPipelines",
3152 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3153 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3154 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3155 }
3156 }
3157
Dustin Gravesc900f572016-05-16 11:07:59 -06003158 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3159 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3160 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3161 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3162 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3163 i);
3164 }
3165
3166 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3167 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3168 skip_call |= validate_ranged_enum(
3169 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3170 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3171 }
3172 }
3173 }
3174 }
3175
3176 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003177 PreCreateGraphicsPipelines(device, pCreateInfos);
3178
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003179 result = get_dispatch_table(pc_device_table_map, device)
3180 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003181
Dustin Gravesc900f572016-05-16 11:07:59 -06003182 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003183 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003184
3185 return result;
3186}
3187
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003188bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003189 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003191 if (pCreateInfos != nullptr) {
3192 // TODO: Handle count!
3193 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003194 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003195 }
3196
3197 return true;
3198}
3199
Chia-I Wu01ca2372016-05-13 14:37:49 +08003200VKAPI_ATTR VkResult VKAPI_CALL
3201CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3202 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3203 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003204 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003205 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003206 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003207 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003208
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003209 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003210 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003211
Dustin Graves080069b2016-04-05 13:48:15 -06003212 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003213 PreCreateComputePipelines(device, pCreateInfos);
3214
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003215 result = get_dispatch_table(pc_device_table_map, device)
3216 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003217
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003218 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003219 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003220
3221 return result;
3222}
3223
Chia-I Wu01ca2372016-05-13 14:37:49 +08003224VKAPI_ATTR void VKAPI_CALL
3225DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003226 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003227 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003228 assert(my_data != NULL);
3229
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003230 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003231
Dustin Graves080069b2016-04-05 13:48:15 -06003232 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003233 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003234 }
3235}
3236
Chia-I Wu01ca2372016-05-13 14:37:49 +08003237VKAPI_ATTR VkResult VKAPI_CALL
3238CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3239 VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003240 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003241 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003242 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003243 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003244
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003245 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003246
Dustin Graves080069b2016-04-05 13:48:15 -06003247 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003248 result =
3249 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003250
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003251 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003252 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003253
3254 return result;
3255}
3256
Chia-I Wu01ca2372016-05-13 14:37:49 +08003257VKAPI_ATTR void VKAPI_CALL
3258DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003259 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003261 assert(my_data != NULL);
3262
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003263 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003264
Dustin Graves080069b2016-04-05 13:48:15 -06003265 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003266 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003267 }
3268}
3269
Chia-I Wu01ca2372016-05-13 14:37:49 +08003270VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3271 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003272 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003273 bool skip_call = false;
3274 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3275 assert(device_data != NULL);
3276 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003277
Dustin Gravesc900f572016-05-16 11:07:59 -06003278 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003279
Dustin Gravesc900f572016-05-16 11:07:59 -06003280 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3281 if (pCreateInfo != nullptr) {
3282 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3283 if (pCreateInfo->compareEnable == VK_TRUE) {
3284 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3285 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3286 }
3287
3288 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3289 // valid VkBorderColor value
3290 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3291 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3292 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3293 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3294 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3295 }
3296 }
3297
3298 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003299 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3300
Dustin Gravesc900f572016-05-16 11:07:59 -06003301 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003302 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003303
3304 return result;
3305}
3306
Chia-I Wu01ca2372016-05-13 14:37:49 +08003307VKAPI_ATTR void VKAPI_CALL
3308DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003309 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003310 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003311 assert(my_data != NULL);
3312
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003313 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003314
Dustin Graves080069b2016-04-05 13:48:15 -06003315 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003316 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003317 }
3318}
3319
Chia-I Wu01ca2372016-05-13 14:37:49 +08003320VKAPI_ATTR VkResult VKAPI_CALL
3321CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3322 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003323 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003324 bool skip_call = false;
3325 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3326 assert(device_data != nullptr);
3327 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003328
Dustin Gravesc900f572016-05-16 11:07:59 -06003329 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003330
Dustin Gravesc900f572016-05-16 11:07:59 -06003331 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3332 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3333 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3334 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3335 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3336 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3337 // valid VkSampler handles
3338 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3339 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3340 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3341 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3342 ++descriptor_index) {
3343 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3344 skip_call |=
3345 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3346 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3347 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3348 " specified as VK_NULL_HANDLE",
3349 i, descriptor_index);
3350 }
3351 }
3352 }
3353
3354 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3355 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3356 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3357 skip_call |=
3358 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3359 UNRECOGNIZED_VALUE, LayerName,
3360 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3361 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3362 i, i);
3363 }
3364 }
3365 }
3366 }
3367
3368 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003369 result =
3370 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003371
Dustin Gravesc900f572016-05-16 11:07:59 -06003372 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003373 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003374
3375 return result;
3376}
3377
Chia-I Wu01ca2372016-05-13 14:37:49 +08003378VKAPI_ATTR void VKAPI_CALL
3379DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003380 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003381 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003382 assert(my_data != NULL);
3383
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003384 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003385
Dustin Graves080069b2016-04-05 13:48:15 -06003386 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003387 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003388 }
3389}
3390
Chia-I Wu01ca2372016-05-13 14:37:49 +08003391VKAPI_ATTR VkResult VKAPI_CALL
3392CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3393 VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003394 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003395 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003396 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003397 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003398
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003399 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003400
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003401 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3402
Dustin Graves080069b2016-04-05 13:48:15 -06003403 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003404 result =
3405 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003406
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003407 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003408 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003409
3410 return result;
3411}
3412
Chia-I Wu01ca2372016-05-13 14:37:49 +08003413VKAPI_ATTR void VKAPI_CALL
3414DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003415 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003416 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003417 assert(my_data != NULL);
3418
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003419 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003420
Dustin Graves080069b2016-04-05 13:48:15 -06003421 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003422 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003423 }
3424}
3425
Chia-I Wu01ca2372016-05-13 14:37:49 +08003426VKAPI_ATTR VkResult VKAPI_CALL
3427ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003428 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3429 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003430 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3431 assert(my_data != NULL);
3432
Dustin Graves20fd66f2016-04-18 18:33:21 -06003433 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003434
Dustin Graves20fd66f2016-04-18 18:33:21 -06003435 if (!skipCall) {
3436 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3437
3438 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3439 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003440
3441 return result;
3442}
3443
Chia-I Wu01ca2372016-05-13 14:37:49 +08003444VKAPI_ATTR VkResult VKAPI_CALL
3445AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003446 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003447 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003448 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003449 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003450
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003451 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003452
Dustin Graves080069b2016-04-05 13:48:15 -06003453 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003454 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3455
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003456 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003457 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003458
3459 return result;
3460}
3461
Chia-I Wu01ca2372016-05-13 14:37:49 +08003462VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3463 uint32_t descriptorSetCount,
3464 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003465 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003466 bool skip_call = false;
3467 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3468 assert(device_data != nullptr);
3469 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003470
Dustin Gravesc900f572016-05-16 11:07:59 -06003471 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003472
Dustin Gravesc900f572016-05-16 11:07:59 -06003473 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3474 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3475 // validate_array()
3476 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3477 pDescriptorSets, true, true);
3478
3479 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003480 result = get_dispatch_table(pc_device_table_map, device)
3481 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003482
Dustin Gravesc900f572016-05-16 11:07:59 -06003483 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003484 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003485
3486 return result;
3487}
3488
Chia-I Wu01ca2372016-05-13 14:37:49 +08003489VKAPI_ATTR void VKAPI_CALL
3490UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3491 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003492 bool skip_call = false;
3493 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3494 assert(device_data != NULL);
3495 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003496
Dustin Gravesc900f572016-05-16 11:07:59 -06003497 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3498 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003499
Dustin Gravesc900f572016-05-16 11:07:59 -06003500 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3501 if (pDescriptorWrites != NULL) {
3502 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3503 // descriptorCount must be greater than 0
3504 if (pDescriptorWrites[i].descriptorCount == 0) {
3505 skip_call |=
3506 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3507 REQUIRED_PARAMETER, LayerName,
3508 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3509 }
3510
3511 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3512 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3513 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3514 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3515 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3516 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3517 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3518 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3519 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3520 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3521 __LINE__, REQUIRED_PARAMETER, LayerName,
3522 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3523 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3524 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3525 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3526 i, i);
3527 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3528 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3529 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3530 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3531 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3532 ++descriptor_index) {
3533 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3534 "pDescriptorWrites[i].pImageInfo[i].imageView",
3535 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3536 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3537 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3538 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3539 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3540 }
3541 }
3542 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3543 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3544 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3545 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3546 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3547 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3548 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3549 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3550 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3551 __LINE__, REQUIRED_PARAMETER, LayerName,
3552 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3553 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3554 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3555 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3556 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003557 } else {
3558 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3559 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3560 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3561 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3562 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003563 }
3564 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3565 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3566 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3567 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3568 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3569 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3570 __LINE__, REQUIRED_PARAMETER, LayerName,
3571 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3572 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3573 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3574 i, i);
3575 } else {
3576 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3577 ++descriptor_index) {
3578 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3579 "pDescriptorWrites[i].pTexelBufferView[i]",
3580 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3581 }
3582 }
3583 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003584
3585 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3586 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3587 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3588 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3589 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3590 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3591 skip_call |=
3592 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003593 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003594 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3595 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3596 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3597 }
3598 }
3599 }
3600 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3601 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3602 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3603 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3604 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3605 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3606 skip_call |=
3607 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003608 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003609 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3610 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3611 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3612 }
3613 }
3614 }
3615 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003616 }
3617 }
3618
3619 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003620 get_dispatch_table(pc_device_table_map, device)
3621 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003622 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003623}
3624
Chia-I Wu01ca2372016-05-13 14:37:49 +08003625VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3626 const VkAllocationCallbacks *pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003627 VkFramebuffer *pFramebuffer) {
3628 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003629 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003630 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003631 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003632
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003633 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003634
Dustin Graves080069b2016-04-05 13:48:15 -06003635 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003636 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3637
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003638 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003639 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003640
3641 return result;
3642}
3643
Chia-I Wu01ca2372016-05-13 14:37:49 +08003644VKAPI_ATTR void VKAPI_CALL
3645DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003646 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003647 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003648 assert(my_data != NULL);
3649
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003650 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003651
Dustin Graves080069b2016-04-05 13:48:15 -06003652 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003653 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003654 }
3655}
3656
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003657bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3658 bool skip_call = false;
3659 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3660
3661 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3662 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3663 skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3664 __LINE__, DEVICE_LIMIT, "DL",
3665 "Cannot create a render pass with %d color attachments. Max is %d.",
3666 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3667 }
3668 }
3669 return skip_call;
3670}
3671
Chia-I Wu01ca2372016-05-13 14:37:49 +08003672VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3673 const VkAllocationCallbacks *pAllocator,
3674 VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003675 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003676 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003677 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003678 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003679
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003680 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003681 skipCall |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003682
Dustin Graves080069b2016-04-05 13:48:15 -06003683 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3685
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003686 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003687 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003688
3689 return result;
3690}
3691
Chia-I Wu01ca2372016-05-13 14:37:49 +08003692VKAPI_ATTR void VKAPI_CALL
3693DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003694 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003695 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003696 assert(my_data != NULL);
3697
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003698 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003699
Dustin Graves080069b2016-04-05 13:48:15 -06003700 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003701 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003702 }
3703}
3704
Chia-I Wu01ca2372016-05-13 14:37:49 +08003705VKAPI_ATTR void VKAPI_CALL
3706GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003707 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003708 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003709 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003710
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003711 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003712
Dustin Graves080069b2016-04-05 13:48:15 -06003713 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003714 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003715 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003716}
3717
Chia-I Wu01ca2372016-05-13 14:37:49 +08003718VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3719 const VkAllocationCallbacks *pAllocator,
3720 VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003721 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003722 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003724 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003725
Dustin Gravesde628532016-04-21 16:30:17 -06003726 skipCall |=
3727 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003728
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003729 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003730
Dustin Graves080069b2016-04-05 13:48:15 -06003731 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003732 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3733
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003734 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003735 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003736
3737 return result;
3738}
3739
Chia-I Wu01ca2372016-05-13 14:37:49 +08003740VKAPI_ATTR void VKAPI_CALL
3741DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003742 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003744 assert(my_data != NULL);
3745
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003746 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003747
Dustin Graves080069b2016-04-05 13:48:15 -06003748 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003749 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003750 }
3751}
3752
Chia-I Wu01ca2372016-05-13 14:37:49 +08003753VKAPI_ATTR VkResult VKAPI_CALL
3754ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003755 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3756 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003757 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3758 assert(my_data != NULL);
3759
Dustin Graves20fd66f2016-04-18 18:33:21 -06003760 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003761
Dustin Graves20fd66f2016-04-18 18:33:21 -06003762 if (!skipCall) {
3763 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3764
3765 validate_result(my_data->report_data, "vkResetCommandPool", result);
3766 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003767
3768 return result;
3769}
3770
Chia-I Wu01ca2372016-05-13 14:37:49 +08003771VKAPI_ATTR VkResult VKAPI_CALL
3772AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003774 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003776 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003777
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003778 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003779
Dustin Graves080069b2016-04-05 13:48:15 -06003780 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003781 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3782
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003783 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003784 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003785
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003786 return result;
3787}
3788
Chia-I Wu01ca2372016-05-13 14:37:49 +08003789VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3790 uint32_t commandBufferCount,
3791 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003792 bool skip_call = false;
3793 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3794 assert(device_data != nullptr);
3795 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003796
Dustin Gravesc900f572016-05-16 11:07:59 -06003797 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003798
Dustin Gravesc900f572016-05-16 11:07:59 -06003799 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3800 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3801 // validate_array()
3802 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3803 pCommandBuffers, true, true);
3804
3805 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003806 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003807 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003808 }
3809}
3810
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003811bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3812 bool skip_call = false;
3813 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3814 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3815
3816 if (pInfo != NULL) {
3817 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3818 skip_call |=
3819 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 -06003820 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003821 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3822 "inheritedQueries.");
3823 }
3824
3825 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3826 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3827 skip_call |=
3828 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 -06003829 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003830 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3831 "valid combination of VkQueryControlFlagBits.",
3832 pInfo->queryFlags);
3833 }
3834 }
3835 return skip_call;
3836}
3837
3838VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003839 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003840 bool skip_call = false;
3841 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3842 assert(device_data != nullptr);
3843 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003844
Dustin Gravesc900f572016-05-16 11:07:59 -06003845 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003846
Dustin Gravesc900f572016-05-16 11:07:59 -06003847 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3848 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3849 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3850 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3851 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3852
3853 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003854 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003855 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003856
3857 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3858 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3859
Dustin Gravesc900f572016-05-16 11:07:59 -06003860 // TODO: This only needs to be validated when the inherited queries feature is enabled
3861 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3862 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3863
3864 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3865 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3866 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3867 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3868 }
3869
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003870 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3871
Dustin Gravesc900f572016-05-16 11:07:59 -06003872 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003873 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3874
Dustin Gravesc900f572016-05-16 11:07:59 -06003875 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003876 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003877
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003878 return result;
3879}
3880
Chia-I Wu01ca2372016-05-13 14:37:49 +08003881VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003882 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3883 assert(my_data != NULL);
3884
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003885 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003886
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003887 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003888
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003889 return result;
3890}
3891
Chia-I Wu01ca2372016-05-13 14:37:49 +08003892VKAPI_ATTR VkResult VKAPI_CALL
3893ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003894 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003895 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3896 assert(my_data != NULL);
3897
Dustin Graves16d18972016-05-09 17:36:57 -06003898 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003899
Dustin Graves16d18972016-05-09 17:36:57 -06003900 if (!skip_call) {
3901 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3902
3903 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3904 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003905
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003906 return result;
3907}
3908
Chia-I Wu01ca2372016-05-13 14:37:49 +08003909VKAPI_ATTR void VKAPI_CALL
3910CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003911 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003912 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3913 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003914
Dustin Graves29148ff2016-03-23 19:44:00 -06003915 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3916
Dustin Graves080069b2016-04-05 13:48:15 -06003917 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003918 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3919 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003920}
3921
Chia-I Wu01ca2372016-05-13 14:37:49 +08003922VKAPI_ATTR void VKAPI_CALL
3923CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003924 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003925 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003926 assert(my_data != NULL);
3927
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003928 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003929
Dustin Graves080069b2016-04-05 13:48:15 -06003930 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003931 get_dispatch_table(pc_device_table_map, commandBuffer)
3932 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003933 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003934}
3935
Chia-I Wu01ca2372016-05-13 14:37:49 +08003936VKAPI_ATTR void VKAPI_CALL
3937CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003938 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003939 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003940 assert(my_data != NULL);
3941
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003942 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003943
Dustin Graves080069b2016-04-05 13:48:15 -06003944 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003945 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3946 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947}
3948
Chia-I Wu01ca2372016-05-13 14:37:49 +08003949VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003950 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003951}
3952
Chia-I Wu01ca2372016-05-13 14:37:49 +08003953VKAPI_ATTR void VKAPI_CALL
3954CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003955 get_dispatch_table(pc_device_table_map, commandBuffer)
3956 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003957}
3958
Chia-I Wu01ca2372016-05-13 14:37:49 +08003959VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003960 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003961 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003962 assert(my_data != NULL);
3963
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003964 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003965
Dustin Graves080069b2016-04-05 13:48:15 -06003966 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003967 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3968 }
Cody Northrop12365112015-08-17 11:10:49 -06003969}
3970
Chia-I Wu01ca2372016-05-13 14:37:49 +08003971VKAPI_ATTR void VKAPI_CALL
3972CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003973 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003974}
3975
Chia-I Wu01ca2372016-05-13 14:37:49 +08003976VKAPI_ATTR void VKAPI_CALL
3977CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003978 bool skipCall = false;
3979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3980 assert(my_data != NULL);
3981
3982 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3983
3984 if (!skipCall) {
3985 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3986 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003987}
3988
Chia-I Wu01ca2372016-05-13 14:37:49 +08003989VKAPI_ATTR void VKAPI_CALL
3990CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003991 bool skipCall = false;
3992 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3993 assert(my_data != NULL);
3994
3995 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3996
3997 if (!skipCall) {
3998 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3999 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004000}
4001
Chia-I Wu01ca2372016-05-13 14:37:49 +08004002VKAPI_ATTR void VKAPI_CALL
4003CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06004004 bool skipCall = false;
4005 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4006 assert(my_data != NULL);
4007
4008 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
4009
4010 if (!skipCall) {
4011 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4012 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004013}
4014
Chia-I Wu01ca2372016-05-13 14:37:49 +08004015VKAPI_ATTR void VKAPI_CALL
4016CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
4017 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
4018 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06004019 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004020 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004021 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004022
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004023 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004024 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004025
Dustin Graves080069b2016-04-05 13:48:15 -06004026 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004027 get_dispatch_table(pc_device_table_map, commandBuffer)
4028 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4029 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004030 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004031}
4032
Chia-I Wu01ca2372016-05-13 14:37:49 +08004033VKAPI_ATTR void VKAPI_CALL
4034CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06004035 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004036 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4037 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004038
Dustin Graves29148ff2016-03-23 19:44:00 -06004039 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
4040
Dustin Graves080069b2016-04-05 13:48:15 -06004041 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004042 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4043 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004044}
4045
Chia-I Wu01ca2372016-05-13 14:37:49 +08004046VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4047 uint32_t bindingCount, const VkBuffer *pBuffers,
4048 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06004049 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004050 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004051 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004052
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004053 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004054
Dustin Graves080069b2016-04-05 13:48:15 -06004055 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004056 get_dispatch_table(pc_device_table_map, commandBuffer)
4057 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004058 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004059}
4060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004061bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4062 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004063 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004064 // 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 -07004065 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004066 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 -06004067 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004068 return false;
4069 }
4070
4071 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004072 // 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 -07004073 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004074 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 -06004075 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004076 return false;
4077 }
4078
4079 return true;
4080}
4081
Chia-I Wu01ca2372016-05-13 14:37:49 +08004082VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4083 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004084 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004085
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004086 get_dispatch_table(pc_device_table_map, commandBuffer)
4087 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004088}
4089
Chia-I Wu01ca2372016-05-13 14:37:49 +08004090VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
4091 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
4092 uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004093 get_dispatch_table(pc_device_table_map, commandBuffer)
4094 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004095}
4096
Chia-I Wu01ca2372016-05-13 14:37:49 +08004097VKAPI_ATTR void VKAPI_CALL
4098CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004099 bool skipCall = false;
4100 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4101 assert(my_data != NULL);
4102
4103 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
4104
4105 if (!skipCall) {
4106 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4107 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004108}
4109
Chia-I Wu01ca2372016-05-13 14:37:49 +08004110VKAPI_ATTR void VKAPI_CALL
4111CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004112 bool skipCall = false;
4113 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4114 assert(my_data != NULL);
4115
4116 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
4117
4118 if (!skipCall) {
4119 get_dispatch_table(pc_device_table_map, commandBuffer)
4120 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4121 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004122}
4123
Chia-I Wu01ca2372016-05-13 14:37:49 +08004124VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004125 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004126}
4127
Chia-I Wu01ca2372016-05-13 14:37:49 +08004128VKAPI_ATTR void VKAPI_CALL
4129CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004130 bool skipCall = false;
4131 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4132 assert(my_data != NULL);
4133
4134 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
4135
4136 if (!skipCall) {
4137 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4138 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004139}
4140
Chia-I Wu01ca2372016-05-13 14:37:49 +08004141VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4142 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004143 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004145 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004146
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004147 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004148
Dustin Graves080069b2016-04-05 13:48:15 -06004149 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004150 get_dispatch_table(pc_device_table_map, commandBuffer)
4151 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004152 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004153}
4154
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004155bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4156 if (pRegions != nullptr) {
4157 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4158 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004159 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 -06004160 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004161 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4162 return false;
4163 }
4164 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4165 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004166 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 -06004167 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004168 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4169 return false;
4170 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004171 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004172
4173 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004174}
4175
Chia-I Wu01ca2372016-05-13 14:37:49 +08004176VKAPI_ATTR void VKAPI_CALL
4177CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4178 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004179 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004180 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004181 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004183 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004184 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004185
Dustin Graves080069b2016-04-05 13:48:15 -06004186 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004187 PreCmdCopyImage(commandBuffer, pRegions);
4188
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004189 get_dispatch_table(pc_device_table_map, commandBuffer)
4190 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004191 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004192}
4193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004194bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4195 if (pRegions != nullptr) {
4196 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4197 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004198 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 -06004199 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004200 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4201 return false;
4202 }
4203 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4204 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004205 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 -06004206 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004207 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4208 return false;
4209 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004210 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004211
4212 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004213}
4214
Chia-I Wu01ca2372016-05-13 14:37:49 +08004215VKAPI_ATTR void VKAPI_CALL
4216CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4217 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06004218 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004219 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004220 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004221
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004222 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004223 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004224
Dustin Graves080069b2016-04-05 13:48:15 -06004225 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004226 PreCmdBlitImage(commandBuffer, pRegions);
4227
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004228 get_dispatch_table(pc_device_table_map, commandBuffer)
4229 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004230 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004231}
4232
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004233bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4234 if (pRegions != nullptr) {
4235 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4236 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004237 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 -06004238 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004239 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4240 "enumerator");
4241 return false;
4242 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004243 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004244
4245 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004246}
4247
Chia-I Wu01ca2372016-05-13 14:37:49 +08004248VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4249 VkImage dstImage, VkImageLayout dstImageLayout,
4250 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004251 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004252 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004253 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004254
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004255 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004256 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004257
Dustin Graves080069b2016-04-05 13:48:15 -06004258 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004259 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4260
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261 get_dispatch_table(pc_device_table_map, commandBuffer)
4262 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004263 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004264}
4265
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004266bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4267 if (pRegions != nullptr) {
4268 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4269 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004270 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 -06004271 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004272 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4273 "enumerator");
4274 return false;
4275 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004276 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004277
4278 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004279}
4280
Chia-I Wu01ca2372016-05-13 14:37:49 +08004281VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4282 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4283 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004284 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004285 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004286 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004287
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004288 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004289 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004290
Dustin Graves080069b2016-04-05 13:48:15 -06004291 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004292 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 get_dispatch_table(pc_device_table_map, commandBuffer)
4295 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004296 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004297}
4298
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004299VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4300 VkDeviceSize dataSize, const uint32_t *pData) {
4301 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004302 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004303 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004304
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004305 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004306
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004307 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004308 skip_call |= log_msg(
4309 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4310 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004311 }
4312
4313 if ((dataSize <= 0) || (dataSize > 65536)) {
4314 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 -06004315 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4316 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004317 dataSize);
4318 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004319 skip_call |= log_msg(
4320 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4321 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004322 }
4323
4324 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004325 get_dispatch_table(pc_device_table_map, commandBuffer)
4326 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004327 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328}
4329
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004330VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4331 VkDeviceSize size, uint32_t data) {
4332 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004333 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4334 assert(my_data != NULL);
4335
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004336 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004337
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004338 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004339 skip_call |= log_msg(
4340 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4341 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004342 }
4343
4344 if (size != VK_WHOLE_SIZE) {
4345 if (size <= 0) {
4346 skip_call |= log_msg(
4347 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004348 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004349 } else if (size & 3) {
4350 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 -06004351 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004352 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4353 }
4354 }
4355
4356 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004357 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4358 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004359}
4360
Chia-I Wu01ca2372016-05-13 14:37:49 +08004361VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4362 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4363 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004364 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004366 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004367
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004368 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004369
Dustin Graves080069b2016-04-05 13:48:15 -06004370 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004371 get_dispatch_table(pc_device_table_map, commandBuffer)
4372 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004373 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004374}
4375
Chia-I Wu01ca2372016-05-13 14:37:49 +08004376VKAPI_ATTR void VKAPI_CALL
4377CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4378 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4379 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004380 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004381 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004382 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004383
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004384 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004385 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004386
Dustin Graves080069b2016-04-05 13:48:15 -06004387 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004388 get_dispatch_table(pc_device_table_map, commandBuffer)
4389 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004390 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004391}
4392
Chia-I Wu01ca2372016-05-13 14:37:49 +08004393VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4394 const VkClearAttachment *pAttachments, uint32_t rectCount,
4395 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004396 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004397 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004398 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004399
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004400 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004401
Dustin Graves080069b2016-04-05 13:48:15 -06004402 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004403 get_dispatch_table(pc_device_table_map, commandBuffer)
4404 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004405 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004406}
4407
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004408bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4409 if (pRegions != nullptr) {
4410 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4411 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4412 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004413 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004414 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004415 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4416 return false;
4417 }
4418 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4419 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4420 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004421 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004422 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004423 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4424 return false;
4425 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004426 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004427
4428 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004429}
4430
Chia-I Wu01ca2372016-05-13 14:37:49 +08004431VKAPI_ATTR void VKAPI_CALL
4432CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4433 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004434 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004435 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004436 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004437
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004438 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004439 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004440
Dustin Graves080069b2016-04-05 13:48:15 -06004441 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004442 PreCmdResolveImage(commandBuffer, pRegions);
4443
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004444 get_dispatch_table(pc_device_table_map, commandBuffer)
4445 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004446 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004447}
4448
Chia-I Wu01ca2372016-05-13 14:37:49 +08004449VKAPI_ATTR void VKAPI_CALL
4450CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004451 bool skipCall = false;
4452 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4453 assert(my_data != NULL);
4454
4455 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4456
4457 if (!skipCall) {
4458 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4459 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004460}
4461
Chia-I Wu01ca2372016-05-13 14:37:49 +08004462VKAPI_ATTR void VKAPI_CALL
4463CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004464 bool skipCall = false;
4465 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4466 assert(my_data != NULL);
4467
4468 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4469
4470 if (!skipCall) {
4471 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4472 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004473}
4474
Chia-I Wu01ca2372016-05-13 14:37:49 +08004475VKAPI_ATTR void VKAPI_CALL
4476CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4477 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4478 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4479 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004480 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004481 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004482 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004483
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004484 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004485 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4486 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004487
Dustin Graves080069b2016-04-05 13:48:15 -06004488 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004489 get_dispatch_table(pc_device_table_map, commandBuffer)
4490 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4491 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004492 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004493}
4494
Chia-I Wu01ca2372016-05-13 14:37:49 +08004495VKAPI_ATTR void VKAPI_CALL
4496CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4497 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4498 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4499 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004500 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004501 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004502 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004503
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004504 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004505 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4506 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004507
Dustin Graves080069b2016-04-05 13:48:15 -06004508 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004509 get_dispatch_table(pc_device_table_map, commandBuffer)
4510 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4511 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004512 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004513}
4514
Chia-I Wu01ca2372016-05-13 14:37:49 +08004515VKAPI_ATTR void VKAPI_CALL
4516CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004517 bool skipCall = false;
4518 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4519 assert(my_data != NULL);
4520
4521 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4522
4523 if (!skipCall) {
4524 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4525 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004526}
4527
Chia-I Wu01ca2372016-05-13 14:37:49 +08004528VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004529 bool skipCall = false;
4530 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4531 assert(my_data != NULL);
4532
4533 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4534
4535 if (!skipCall) {
4536 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4537 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004538}
4539
Chia-I Wu01ca2372016-05-13 14:37:49 +08004540VKAPI_ATTR void VKAPI_CALL
4541CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004542 bool skipCall = false;
4543 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4544 assert(my_data != NULL);
4545
4546 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4547
4548 if (!skipCall) {
4549 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4550 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004551}
4552
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004553bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4554 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004555
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004556 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004557
4558 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004559}
4560
Chia-I Wu01ca2372016-05-13 14:37:49 +08004561VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4562 VkQueryPool queryPool, uint32_t query) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004563 bool skipCall = false;
4564 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4565 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004566
Dustin Graves20fd66f2016-04-18 18:33:21 -06004567 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4568
4569 if (!skipCall) {
4570 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4571
4572 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4573 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004574}
4575
Chia-I Wu01ca2372016-05-13 14:37:49 +08004576VKAPI_ATTR void VKAPI_CALL
4577CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4578 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004579 bool skipCall = false;
4580 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4581 assert(my_data != NULL);
4582
4583 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4584 dstOffset, stride, flags);
4585
4586 if (!skipCall) {
4587 get_dispatch_table(pc_device_table_map, commandBuffer)
4588 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4589 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004590}
4591
Chia-I Wu01ca2372016-05-13 14:37:49 +08004592VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4593 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4594 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004595 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004596 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004597 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004598
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004599 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004600
Dustin Graves080069b2016-04-05 13:48:15 -06004601 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004602 get_dispatch_table(pc_device_table_map, commandBuffer)
4603 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004604 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004605}
4606
Chia-I Wu01ca2372016-05-13 14:37:49 +08004607VKAPI_ATTR void VKAPI_CALL
4608CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004609 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004610 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004611 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004612
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004613 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004614
Dustin Graves080069b2016-04-05 13:48:15 -06004615 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004616 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004617 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004618}
4619
Chia-I Wu01ca2372016-05-13 14:37:49 +08004620VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004621 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004622 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4623 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004624
Dustin Graves29148ff2016-03-23 19:44:00 -06004625 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4626
Dustin Graves080069b2016-04-05 13:48:15 -06004627 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004628 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4629 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004630}
4631
Chia-I Wu01ca2372016-05-13 14:37:49 +08004632VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004633 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004634}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004635
Chia-I Wu01ca2372016-05-13 14:37:49 +08004636VKAPI_ATTR void VKAPI_CALL
4637CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004638 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004639 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004640 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004641
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004642 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004643
Dustin Graves080069b2016-04-05 13:48:15 -06004644 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004645 get_dispatch_table(pc_device_table_map, commandBuffer)
4646 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004647 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004648}
4649
Chia-I Wub02600c2016-05-20 07:11:22 +08004650VKAPI_ATTR VkResult VKAPI_CALL
4651EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4652 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4653}
4654
4655VKAPI_ATTR VkResult VKAPI_CALL
4656EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
4657 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4658}
4659
4660VKAPI_ATTR VkResult VKAPI_CALL
4661EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
4662 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4663 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4664
4665 return VK_ERROR_LAYER_NOT_PRESENT;
4666}
4667
Chia-I Wu01ca2372016-05-13 14:37:49 +08004668VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4669 const char *pLayerName, uint32_t *pCount,
4670 VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004671 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004672 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004673 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004674
4675 assert(physicalDevice);
4676
4677 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4678 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004679}
4680
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004681
4682// WSI Extension Functions
4683
4684VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
4685 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
4686 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4687 bool skipCall = false;
4688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4689 assert(my_data != NULL);
4690
4691 skipCall |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
4692
4693 if (!skipCall) {
4694 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4695
4696 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4697 }
4698
4699 return result;
4700}
4701
4702VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
4703 VkImage *pSwapchainImages) {
4704 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4705 bool skipCall = false;
4706 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4707 assert(my_data != NULL);
4708
4709 skipCall |=
4710 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4711
4712 if (!skipCall) {
4713 result = get_dispatch_table(pc_device_table_map, device)
4714 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4715
4716 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4717 }
4718
4719 return result;
4720}
4721
4722VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
4723 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
4724 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4725 bool skipCall = false;
4726 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4727 assert(my_data != NULL);
4728
4729 skipCall |=
4730 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4731
4732 if (!skipCall) {
4733 result = get_dispatch_table(pc_device_table_map, device)
4734 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
4735
4736 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4737 }
4738
4739 return result;
4740}
4741
4742VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4743 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4744 bool skipCall = false;
4745 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4746 assert(my_data != NULL);
4747
4748 skipCall |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
4749
4750 if (!skipCall) {
4751 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4752
4753 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4754 }
4755
4756 return result;
4757}
4758
4759VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4760 VkSurfaceKHR surface, VkBool32 *pSupported) {
4761 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4762 bool skipCall = false;
4763 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4764 assert(my_data != NULL);
4765
4766 skipCall |=
4767 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4768
4769 if (!skipCall) {
4770 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4771 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4772
4773 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4774 }
4775
4776 return result;
4777}
4778
4779VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4780 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4781 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4782 bool skipCall = false;
4783 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4784 assert(my_data != NULL);
4785
4786 skipCall |= parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
4787
4788 if (!skipCall) {
4789 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4790 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4791
4792 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4793 }
4794
4795 return result;
4796}
4797
4798VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4799 uint32_t *pSurfaceFormatCount,
4800 VkSurfaceFormatKHR *pSurfaceFormats) {
4801 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4802 bool skipCall = false;
4803 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4804 assert(my_data != NULL);
4805
4806 skipCall |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4807 pSurfaceFormats);
4808
4809 if (!skipCall) {
4810 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4811 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4812
4813 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4814 }
4815
4816 return result;
4817}
4818
4819VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4820 uint32_t *pPresentModeCount,
4821 VkPresentModeKHR *pPresentModes) {
4822 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4823 bool skipCall = false;
4824 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4825 assert(my_data != NULL);
4826
4827 skipCall |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4828 pPresentModes);
4829
4830 if (!skipCall) {
4831 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4832 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4833
4834 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4835 }
4836
4837 return result;
4838}
4839
4840#ifdef VK_USE_PLATFORM_WIN32_KHR
4841VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4842 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4843 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4844
4845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4846 assert(my_data != NULL);
4847
4848 bool skipCall = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
4849
4850 if (!skipCall) {
4851 result =
4852 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4853 }
4854
4855 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4856
4857 return result;
4858}
4859#endif // VK_USE_PLATFORM_WIN32_KHR
4860
4861#ifdef VK_USE_PLATFORM_XCB_KHR
4862VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4863 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4864 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4865
4866 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4867 assert(my_data != NULL);
4868
4869 bool skipCall = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
4870
4871 if (!skipCall) {
4872 result =
4873 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4874 }
4875
4876 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4877
4878 return result;
4879}
4880
4881VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t *connection, xcb_visualid_t visual_id) {
4882 VkBool32 result = false;
4883
4884 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4885 assert(my_data != NULL);
4886
4887 bool skipCall = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection, visual_id);
4888
4889 if (!skipCall) {
4890 result =
4891 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
4892 }
4893
4894 return result;
4895
4896}
4897#endif // VK_USE_PLATFORM_XCB_KHR
4898
4899#ifdef VK_USE_PLATFORM_XLIB_KHR
4900VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
4901 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4902 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4903
4904 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4905 assert(my_data != NULL);
4906
4907 bool skipCall = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
4908
4909 if (!skipCall) {
4910 result =
4911 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4912 }
4913
4914 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4915
4916 return result;
4917}
4918
4919VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display *dpy, VisualID visualID) {
4920 VkBool32 result = false;
4921
4922 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4923 assert(my_data != NULL);
4924
4925 bool skipCall = parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
4926
4927 if (!skipCall) {
4928 result =
4929 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
4930 }
4931
4932}
4933#endif // VK_USE_PLATFORM_XLIB_KHR
4934
4935#ifdef VK_USE_PLATFORM_MIR_KHR
4936VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
4937 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4938 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4939
4940 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4941 assert(my_data != NULL);
4942
4943 bool skipCall = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
4944
4945 if (!skipCall) {
4946 result =
4947 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4948 }
4949
4950 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4951
4952 return result;
4953}
4954
4955VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, MirConnection *connection) {
4956 VkBool32 result = false;
4957
4958 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4959 assert(my_data != NULL);
4960
4961 bool skipCall = parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
4962
4963 if (!skipCall) {
4964 result =
4965 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
4966 }
4967
4968}
4969#endif // VK_USE_PLATFORM_MIR_KHR
4970
4971#ifdef VK_USE_PLATFORM_WAYLAND_KHR
4972VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
4973 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4974 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4975
4976 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4977 assert(my_data != NULL);
4978
4979 bool skipCall = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
4980
4981 if (!skipCall) {
4982 result =
4983 get_dispatch_table(pc_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4984 }
4985
4986 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
4987
4988 return result;
4989}
4990
4991VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display *display) {
4992 VkBool32 result = false;
4993
4994 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4995 assert(my_data != NULL);
4996
4997 bool skipCall = parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
4998
4999 if (!skipCall) {
5000 result =
5001 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
5002 }
5003}
5004#endif // VK_USE_PLATFORM_WAYLAND_KHR
5005
5006#ifdef VK_USE_PLATFORM_ANDROID_KHR
5007VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
5008 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5009 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5010
5011 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5012 assert(my_data != NULL);
5013
5014 bool skipCall = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
5015
5016 if (!skipCall) {
5017 result =
5018 get_dispatch_table(pc_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5019 }
5020
5021 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5022
5023 return result;
5024}
5025#endif // VK_USE_PLATFORM_ANDROID_KHR
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
Chia-I Wuf9b01382016-05-16 07:37:41 +08005037static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08005038intercept_core_instance_command(const char *name);
5039
5040static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08005041intercept_core_device_command(const char *name);
5042
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005043static PFN_vkVoidFunction
5044InterceptWsiEnabledCommand(const char *name, VkDevice device);
5045
5046static PFN_vkVoidFunction
5047InterceptWsiEnabledCommand(const char *name, VkInstance instance);
5048
Chia-I Wu01ca2372016-05-13 14:37:49 +08005049VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005050 assert(device);
5051
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005052 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5053
Dustin Graves080069b2016-04-05 13:48:15 -06005054 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005055 return NULL;
5056 }
5057
Chia-I Wuf9b01382016-05-16 07:37:41 +08005058 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5059 if (proc)
5060 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005061
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005062 proc = InterceptWsiEnabledCommand(funcName, device);
5063 if (proc)
5064 return proc;
5065
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005066 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005067 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005068 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005069}
5070
Chia-I Wu01ca2372016-05-13 14:37:49 +08005071VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005072 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005073 if (!proc)
5074 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005075
5076 if (!proc)
5077 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
5078
Chia-I Wu617f2a42016-05-16 07:41:17 +08005079 if (proc)
5080 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005081
Chia-I Wu617f2a42016-05-16 07:41:17 +08005082 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005083
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005084 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005085
Chia-I Wu617f2a42016-05-16 07:41:17 +08005086 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005087 if (!proc)
5088 proc = InterceptWsiEnabledCommand(funcName, instance);
5089
Chia-I Wu617f2a42016-05-16 07:41:17 +08005090 if (proc)
5091 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005092
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005093 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005094 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005095 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005096}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005097
Chia-I Wuf9b01382016-05-16 07:37:41 +08005098static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08005099intercept_core_instance_command(const char *name) {
5100 static const struct {
5101 const char *name;
5102 PFN_vkVoidFunction proc;
5103 } core_instance_commands[] = {
5104 { "vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr) },
5105 { "vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance) },
5106 { "vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance) },
5107 { "vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice) },
5108 { "vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices) },
5109 { "vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties) },
5110 { "vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures) },
5111 { "vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties) },
5112 { "vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties) },
5113 { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties) },
5114 { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties) },
5115 { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties) },
Chia-I Wub02600c2016-05-20 07:11:22 +08005116 { "vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties) },
5117 { "vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties) },
5118 { "vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005119 { "vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties) },
5120 };
5121
5122 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5123 if (!strcmp(core_instance_commands[i].name, name))
5124 return core_instance_commands[i].proc;
5125 }
5126
5127 return nullptr;
5128}
5129
5130static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08005131intercept_core_device_command(const char *name) {
5132 static const struct {
5133 const char *name;
5134 PFN_vkVoidFunction proc;
5135 } core_device_commands[] = {
5136 { "vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr) },
5137 { "vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice) },
5138 { "vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue) },
5139 { "vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit) },
5140 { "vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle) },
5141 { "vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle) },
5142 { "vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory) },
5143 { "vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory) },
5144 { "vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory) },
5145 { "vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory) },
5146 { "vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges) },
5147 { "vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges) },
5148 { "vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment) },
5149 { "vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory) },
5150 { "vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory) },
5151 { "vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence) },
5152 { "vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence) },
5153 { "vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences) },
5154 { "vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus) },
5155 { "vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences) },
5156 { "vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore) },
5157 { "vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore) },
5158 { "vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent) },
5159 { "vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent) },
5160 { "vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus) },
5161 { "vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent) },
5162 { "vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent) },
5163 { "vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool) },
5164 { "vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool) },
5165 { "vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults) },
5166 { "vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer) },
5167 { "vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer) },
5168 { "vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView) },
5169 { "vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView) },
5170 { "vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage) },
5171 { "vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage) },
5172 { "vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout) },
5173 { "vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView) },
5174 { "vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView) },
5175 { "vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule) },
5176 { "vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule) },
5177 { "vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache) },
5178 { "vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache) },
5179 { "vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData) },
5180 { "vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches) },
5181 { "vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines) },
5182 { "vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines) },
5183 { "vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline) },
5184 { "vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout) },
5185 { "vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout) },
5186 { "vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler) },
5187 { "vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler) },
5188 { "vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout) },
5189 { "vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout) },
5190 { "vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool) },
5191 { "vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool) },
5192 { "vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool) },
5193 { "vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets) },
5194 { "vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets) },
5195 { "vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets) },
5196 { "vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport) },
5197 { "vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor) },
5198 { "vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth) },
5199 { "vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias) },
5200 { "vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants) },
5201 { "vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds) },
5202 { "vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask) },
5203 { "vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask) },
5204 { "vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference) },
5205 { "vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers) },
5206 { "vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers) },
5207 { "vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer) },
5208 { "vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer) },
5209 { "vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer) },
5210 { "vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline) },
5211 { "vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets) },
5212 { "vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers) },
5213 { "vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer) },
5214 { "vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw) },
5215 { "vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed) },
5216 { "vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect) },
5217 { "vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect) },
5218 { "vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch) },
5219 { "vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect) },
5220 { "vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer) },
5221 { "vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage) },
5222 { "vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage) },
5223 { "vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage) },
5224 { "vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer) },
5225 { "vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer) },
5226 { "vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer) },
5227 { "vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage) },
Chris Forbesfb1426b2016-08-04 15:59:38 +12005228 { "vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage) },
5229 { "vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments) },
Chia-I Wuf9b01382016-05-16 07:37:41 +08005230 { "vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage) },
5231 { "vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent) },
5232 { "vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent) },
5233 { "vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents) },
5234 { "vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier) },
5235 { "vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery) },
5236 { "vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery) },
5237 { "vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool) },
5238 { "vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp) },
5239 { "vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults) },
Chris Forbesfb1426b2016-08-04 15:59:38 +12005240 { "vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants) },
Chia-I Wuf9b01382016-05-16 07:37:41 +08005241 { "vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer) },
5242 { "vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer) },
5243 { "vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass) },
5244 { "vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass) },
5245 { "vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity) },
5246 { "vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool) },
5247 { "vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool) },
5248 { "vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool) },
5249 { "vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass) },
5250 { "vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass) },
Chris Forbesfb1426b2016-08-04 15:59:38 +12005251 { "vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands) },
5252 { "vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass) },
Chia-I Wuf9b01382016-05-16 07:37:41 +08005253 };
5254
5255 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5256 if (!strcmp(core_device_commands[i].name, name))
5257 return core_device_commands[i].proc;
5258 }
5259
5260 return nullptr;
5261}
5262
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005263static PFN_vkVoidFunction
5264InterceptWsiEnabledCommand(const char *name, VkDevice device) {
5265 static const struct {
5266 const char *name;
5267 PFN_vkVoidFunction proc;
5268 } wsi_device_commands[] = {
5269 { "vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR) },
5270 { "vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR) },
5271 { "vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR) },
5272 { "vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR) },
5273 };
5274
5275 if (device) {
5276 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5277 if (!device_data->wsi_enabled)
5278 return nullptr;
5279 }
5280
5281 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5282 if (!strcmp(wsi_device_commands[i].name, name))
5283 return wsi_device_commands[i].proc;
5284 }
5285
5286 return nullptr;
5287}
5288
5289static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5290 static const struct {
5291 const char *name;
5292 PFN_vkVoidFunction proc;
5293 } wsi_instance_commands[] = {
5294 { "vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5295 { "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5296 { "vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5297 { "vkGetPhysicalDeviceSurfacePresentModesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
5298 };
5299
5300 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
5301 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
5302 return nullptr;
5303
5304 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5305 if (!strcmp(wsi_instance_commands[i].name, name))
5306 return wsi_instance_commands[i].proc;
5307 }
5308
5309#ifdef VK_USE_PLATFORM_WIN32_KHR
5310 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
5311 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5312#endif // VK_USE_PLATFORM_WIN32_KHR
5313#ifdef VK_USE_PLATFORM_XCB_KHR
5314 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
5315 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
5316 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
5317 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5318#endif // VK_USE_PLATFORM_XCB_KHR
5319#ifdef VK_USE_PLATFORM_XLIB_KHR
5320 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
5321 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
5322 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
5323 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5324#endif // VK_USE_PLATFORM_XLIB_KHR
5325#ifdef VK_USE_PLATFORM_MIR_KHR
5326 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
5327 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
5328 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
5329 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5330#endif // VK_USE_PLATFORM_MIR_KHR
5331#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5332 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
5333 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
5334 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
5335 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5336#endif // VK_USE_PLATFORM_WAYLAND_KHR
5337#ifdef VK_USE_PLATFORM_ANDROID_KHR
5338 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
5339 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5340#endif // VK_USE_PLATFORM_ANDROID_KHR
5341
5342 return nullptr;
5343}
5344
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005345} // namespace parameter_validation
5346
5347// vk_layer_logging.h expects these to be defined
5348
5349VKAPI_ATTR VkResult VKAPI_CALL
5350vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5351 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005352 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005353}
5354
5355VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
5356 VkDebugReportCallbackEXT msgCallback,
5357 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005358 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005359}
5360
5361VKAPI_ATTR void VKAPI_CALL
5362vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
5363 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005364 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005365}
5366
5367// loader-layer interface v0
5368
Chia-I Wu99f701c2016-05-13 14:06:08 +08005369VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
5370vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005371 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005372}
5373
5374VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
5375vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005376 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005377}
5378
5379VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
5380vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005381 // the layer command handles VK_NULL_HANDLE just fine internally
5382 assert(physicalDevice == VK_NULL_HANDLE);
5383 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005384}
5385
5386VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5387 const char *pLayerName, uint32_t *pCount,
5388 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005389 // the layer command handles VK_NULL_HANDLE just fine internally
5390 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005391 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005392}
5393
5394VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005395 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005396}
5397
5398VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005399 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005400}