blob: 2b12366f1bff5f6b6552cfbb12aa415c7d91aa04 [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 Lobodzinski72ecd912016-08-11 13:25: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 Lobodzinski72ecd912016-08-11 13:25:38 -060081static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600114VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
115 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
116 const VkAllocationCallbacks *pAllocator,
117 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700118 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700119 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600120
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700121 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700122 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600123 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600124 }
125
126 return result;
127}
128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600129VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800130 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600138VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
139 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
140 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001233 bool skip_call = 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) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001238 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001239 } else if (result & VK_STRING_ERROR_LENGTH) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001240 skip_call =
Dustin Gravesf233e502016-05-05 13:44:21 -06001241 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) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001244 skip_call =
Dustin Gravesf233e502016-05-05 13:44:21 -06001245 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 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001248 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001249}
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
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001301static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1302
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001303VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1304 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001305 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001307 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001308 assert(chain_info != nullptr);
1309 assert(chain_info->u.pLayerInfo != nullptr);
1310
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001311 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1312 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001313 if (fpCreateInstance == NULL) {
1314 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001315 }
1316
Dustin Graves842621d2016-03-03 14:17:08 -07001317 // Advance the link info for the next element on the chain
1318 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1319
1320 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001321
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001322 if (result == VK_SUCCESS) {
1323 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1324 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001325
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001326 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001327
Chia-I Wua570b7c2016-05-16 07:48:14 +08001328 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001329 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1330 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001331
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001332 // Look for one or more debug report create info structures
1333 // and setup a callback(s) for each one found.
1334 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1335 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1336 if (my_instance_data->num_tmp_callbacks > 0) {
1337 // Setup the temporary callback(s) here to catch early issues:
1338 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1339 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1340 // Failure of setting up one or more of the callback.
1341 // Therefore, clean up and don't use those callbacks:
1342 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1343 my_instance_data->num_tmp_callbacks = 0;
1344 }
1345 }
1346 }
1347
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001348 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001349 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001350
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001351 // Ordinarily we'd check these before calling down the chain, but none of the layer
1352 // support is in place until now, if we survive we can report the issue now.
1353 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001354
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001355 if (pCreateInfo->pApplicationInfo) {
1356 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1357 validate_string(my_instance_data->report_data, "vkCreateInstance",
1358 "pCreateInfo->VkApplicationInfo->pApplicationName",
1359 pCreateInfo->pApplicationInfo->pApplicationName);
1360 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001361
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001362 if (pCreateInfo->pApplicationInfo->pEngineName) {
1363 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1364 pCreateInfo->pApplicationInfo->pEngineName);
1365 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001366 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001367
1368 // Disable the tmp callbacks:
1369 if (my_instance_data->num_tmp_callbacks > 0) {
1370 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1371 my_instance_data->tmp_callbacks);
1372 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001373 }
1374
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001375 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001376}
1377
Chia-I Wu01ca2372016-05-13 14:37:49 +08001378VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001379 // Grab the key before the instance is destroyed.
1380 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001381 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001382 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001383 assert(my_data != NULL);
1384
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001385 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1386 bool callback_setup = false;
1387 if (my_data->num_tmp_callbacks > 0) {
1388 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1389 my_data->tmp_callbacks)) {
1390 callback_setup = true;
1391 }
1392 }
1393
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001394 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001395
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001396 // Disable and cleanup the temporary callback(s):
1397 if (callback_setup) {
1398 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1399 }
1400 if (my_data->num_tmp_callbacks > 0) {
1401 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1402 my_data->num_tmp_callbacks = 0;
1403 }
1404
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001405 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001406 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001407 pTable->DestroyInstance(instance, pAllocator);
1408
1409 // Clean up logging callback, if any
1410 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001411 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1412 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001413 my_data->logging_callback.pop_back();
1414 }
1415
1416 layer_debug_report_destroy_instance(mid(instance));
1417 layer_data_map.erase(pTable);
1418
1419 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001420 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001421 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001422}
1423
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001424VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1425 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001426 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001427 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001429 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001431 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001432
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001433 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001434 result = get_dispatch_table(pc_instance_table_map, instance)
1435 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001436
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001437 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001438 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1439 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1440 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1441 // Save the supported features for each physical device
1442 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1443 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1444 }
1445 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001446 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001447 return result;
1448}
1449
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001450VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1451 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001452 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001454
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001455 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001456
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001457 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001458 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001460}
1461
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001462VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1463 VkFormatProperties *pFormatProperties) {
1464 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001465 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001466 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001467
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001468 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001470 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001471 get_dispatch_table(pc_instance_table_map, physicalDevice)
1472 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001473 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001474}
1475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001476VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1477 VkImageType type, VkImageTiling tiling,
1478 VkImageUsageFlags usage, VkImageCreateFlags flags,
1479 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001480 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001481 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001482 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001483 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001484
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001485 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1486 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001488 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001489 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1490 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1491 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001492
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001493 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001494 }
Chia-I Wu17241042015-10-31 00:31:16 +08001495
1496 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001497}
1498
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001499VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1500 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001501 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001503
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001504 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001505
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001506 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001507 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001508 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001509}
1510
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001511VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1512 uint32_t *pQueueFamilyPropertyCount,
1513 VkQueueFamilyProperties *pQueueFamilyProperties) {
1514 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001515 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001517
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001518 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1519 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001520
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001521 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001522 get_dispatch_table(pc_instance_table_map, physicalDevice)
1523 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001524 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001525}
1526
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001527VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1528 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1529 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001530 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001531 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001532
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001533 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001534
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001535 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001536 get_dispatch_table(pc_instance_table_map, physicalDevice)
1537 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001538 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001539}
1540
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001541void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1542 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001543 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001544
1545 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1546 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1547 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001548 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 -06001549 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001550 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1551 "structure.",
1552 i);
1553 } else {
1554 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001555 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001556
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001557 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1558 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1559 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1560 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001561 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 -06001562 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001563 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1564 "between 0 and 1. Actual value is %f",
1565 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1566 }
1567 }
1568 }
1569
1570 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1571 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001572 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001573 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001574 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1575 "of queue families.",
1576 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001577 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1578 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1579 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001580 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001581 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001582 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1583 "queues for the given family index.",
1584 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001585 }
Michael Lentine774704f2016-01-27 13:36:46 -06001586 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001587 }
1588}
1589
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001590static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001591 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001592
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001593 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001594
1595 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1596 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001597 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001598 }
1599#ifdef VK_USE_PLATFORM_XLIB_KHR
1600 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001601 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001602 }
1603#endif
1604#ifdef VK_USE_PLATFORM_XCB_KHR
1605 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001606 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001607 }
1608#endif
1609#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1610 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001611 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001612 }
1613#endif
1614#ifdef VK_USE_PLATFORM_MIR_KHR
1615 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001616 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001617 }
1618#endif
1619#ifdef VK_USE_PLATFORM_ANDROID_KHR
1620 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001621 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001622 }
1623#endif
1624#ifdef VK_USE_PLATFORM_WIN32_KHR
1625 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001626 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001627 }
1628#endif
1629 }
1630}
1631
1632static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1633 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1634 device_data->wsi_enabled = false;
1635
1636 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1637 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1638 device_data->wsi_enabled = true;
1639 }
1640 }
1641}
1642
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001643void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001644 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001645
1646 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1647 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1648 my_device_data->queueFamilyIndexMap.insert(
1649 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1650 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001651 }
1652}
1653
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001654VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001655 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;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001662 bool skip_call = 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 Lobodzinski72ecd912016-08-11 13:25:38 -06001666 skip_call |= 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++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001671 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1672 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001673 }
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++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001678 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1679 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001680 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001681 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001682 }
1683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001684 if (!skip_call) {
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);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001741 bool skip_call = 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 Lobodzinski72ecd912016-08-11 13:25:38 -06001745 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001747 if (!skip_call) {
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 Lobodzinski72ecd912016-08-11 13:25:38 -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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001778VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1779 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001781 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001783 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001784
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001785 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1787
1788 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790}
1791
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001792VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001793 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001794 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001796 assert(my_data != NULL);
1797
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001798 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001799
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001800 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001801 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1802
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001803 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001804 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001805
Jeremy Hayes99a96322015-06-26 12:48:09 -06001806 return result;
1807}
1808
Chia-I Wu01ca2372016-05-13 14:37:49 +08001809VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001810 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1811 assert(my_data != NULL);
1812
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001813 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001814
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001815 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001816
1817 return result;
1818}
1819
Chia-I Wu01ca2372016-05-13 14:37:49 +08001820VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001821 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1822 assert(my_data != NULL);
1823
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001824 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001825
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001826 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001827
1828 return result;
1829}
1830
Chia-I Wu01ca2372016-05-13 14:37:49 +08001831VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001832 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001833 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001834 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001835 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001836 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001837
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001838 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001839
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001840 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001841 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1842
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001843 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001844 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001845
1846 return result;
1847}
1848
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001849VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1850 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001851 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001852 assert(my_data != NULL);
1853
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001854 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001855
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001856 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001857 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001858 }
1859}
1860
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001861VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1862 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001863 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001864 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001865 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001866 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001867
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001868 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001869
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001870 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001871 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1872
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001873 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001874 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001875
1876 return result;
1877}
1878
Chia-I Wu01ca2372016-05-13 14:37:49 +08001879VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001880 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001881 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1882 assert(my_data != NULL);
1883
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001884 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001885
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001886 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001887 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1888 }
1889}
1890
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001891VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1892 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001893 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001894 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001895 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001896 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001897
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001898 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001899
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001900 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001901 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1902
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001903 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001904 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001905
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001906 return result;
1907}
1908
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001909VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1910 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001911 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001912 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001915
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001916 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001917
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001918 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001919 result =
1920 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001921
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001922 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001923 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001924
Tony Barbourb1250542015-04-16 19:23:13 -06001925 return result;
1926}
1927
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001928VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1929 VkDeviceSize *pCommittedMemoryInBytes) {
1930 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001931 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001932 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001934 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001935
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001936 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001937 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001938 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001939}
1940
Chia-I Wu01ca2372016-05-13 14:37:49 +08001941VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1942 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001943 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001944 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001945 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1946 assert(my_data != NULL);
1947
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001948 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001950 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001951 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1952
1953 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1954 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001955
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001956 return result;
1957}
1958
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001959VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001960 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001961 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001962 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1963 assert(my_data != NULL);
1964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001965 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001967 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001968 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1969
1970 validate_result(my_data->report_data, "vkBindImageMemory", result);
1971 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001972
1973 return result;
1974}
1975
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001976VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1977 VkMemoryRequirements *pMemoryRequirements) {
1978 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001980 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001981
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001982 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001983
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001984 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001985 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001986 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001987}
1988
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001989VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1990 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001991 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001992 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001993
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001994 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001996 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001997 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001998 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001999}
2000
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002001bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2002 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2003 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002004 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002005 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2006 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002007 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 -06002008 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002009 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2010 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002011 return false;
2012 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002013 }
2014
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002015 return true;
2016}
2017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002018VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2019 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2020 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002022 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002023
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002024 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2025 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002026
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002027 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002028 get_dispatch_table(pc_device_table_map, device)
2029 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002030
2031 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2032 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002033}
2034
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002035bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2036 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2037 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002038 if (pProperties != nullptr) {
2039 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2040 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002041 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 -06002042 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002043 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2044 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002045 return false;
2046 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002047 }
2048
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002049 return true;
2050}
2051
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002052VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2053 VkImageType type, VkSampleCountFlagBits samples,
2054 VkImageUsageFlags usage, VkImageTiling tiling,
2055 uint32_t *pPropertyCount,
2056 VkSparseImageFormatProperties *pProperties) {
2057 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002058 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002059 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002061 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2062 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002064 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002065 get_dispatch_table(pc_instance_table_map, physicalDevice)
2066 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2067 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002068
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002069 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2070 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002071 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002072}
2073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002074VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2075 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002076 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002077 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002078 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002081 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002082
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002083 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002084 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2085
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002086 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002087 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002088
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002089 return result;
2090}
2091
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002092VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2093 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002094 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002095 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002096 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002097 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002098
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002099 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002100
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002101 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002102 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2103
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002104 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002105 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002106
2107 return result;
2108}
2109
Chia-I Wu01ca2372016-05-13 14:37:49 +08002110VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002111 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002112 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002113 assert(my_data != NULL);
2114
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002115 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002116
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002117 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002118 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002119 }
2120}
2121
Chia-I Wu01ca2372016-05-13 14:37:49 +08002122VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002123 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002124 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002125 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002126 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002127
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002128 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002129
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002130 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002131 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2132
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002133 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002134 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002135
2136 return result;
2137}
2138
Chia-I Wu01ca2372016-05-13 14:37:49 +08002139VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002140 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002141 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002142 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2143 assert(my_data != NULL);
2144
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002145 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002146
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002147 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002148 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2149
2150 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2151 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002152
2153 return result;
2154}
2155
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002156VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2157 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002158 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002159 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002160 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002162
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002163 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002164
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002165 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002166 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2167
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002168 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002169 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170
2171 return result;
2172}
2173
Chia-I Wu01ca2372016-05-13 14:37:49 +08002174VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002175 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002176 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002177 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002178 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002179 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002180
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002181 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002182
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002183 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002184 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2185
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002186 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002187 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002188
2189 return result;
2190}
2191
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002192VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2193 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002194 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002195 assert(my_data != NULL);
2196
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002197 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002199 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002201 }
2202}
2203
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002204VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2205 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002206 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002207 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002208 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002209 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002210
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002211 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002212
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002213 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002214 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2215
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002216 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002217 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002218
2219 return result;
2220}
2221
Chia-I Wu01ca2372016-05-13 14:37:49 +08002222VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002223 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002224 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002225 assert(my_data != NULL);
2226
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002227 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002228
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002229 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002230 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002231 }
2232}
2233
Chia-I Wu01ca2372016-05-13 14:37:49 +08002234VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002235 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002236 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002237 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2238 assert(my_data != NULL);
2239
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002240 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002241
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002242 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002243 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2244
2245 validate_result(my_data->report_data, "vkGetEventStatus", result);
2246 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002247
2248 return result;
2249}
2250
Chia-I Wu01ca2372016-05-13 14:37:49 +08002251VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002252 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002253 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002254 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2255 assert(my_data != NULL);
2256
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002257 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002258
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002259 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002260 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2261
2262 validate_result(my_data->report_data, "vkSetEvent", result);
2263 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002264
2265 return result;
2266}
2267
Chia-I Wu01ca2372016-05-13 14:37:49 +08002268VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002269 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002270 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002271 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2272 assert(my_data != NULL);
2273
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002274 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002275
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002276 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002277 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2278
2279 validate_result(my_data->report_data, "vkResetEvent", result);
2280 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002281
2282 return result;
2283}
2284
Chia-I Wu01ca2372016-05-13 14:37:49 +08002285VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002286 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002287 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002288 bool skip_call = false;
2289 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2290 assert(device_data != nullptr);
2291 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002292
Dustin Gravesc900f572016-05-16 11:07:59 -06002293 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002294
Dustin Gravesc900f572016-05-16 11:07:59 -06002295 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2296 if (pCreateInfo != nullptr) {
2297 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2298 // VkQueryPipelineStatisticFlagBits values
2299 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2300 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2301 skip_call |=
2302 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2303 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2304 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2305 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2306 }
2307 }
2308
2309 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002310 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2311
Dustin Gravesc900f572016-05-16 11:07:59 -06002312 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002313 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002314
2315 return result;
2316}
2317
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002318VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2319 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002320 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002321 assert(my_data != NULL);
2322
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002323 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002324
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002325 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002326 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002327 }
2328}
2329
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002330VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2331 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002332 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002333 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002334 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002335 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002336
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002337 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2338 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002339
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002340 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002341 result = get_dispatch_table(pc_device_table_map, device)
2342 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002343
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002344 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002345 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002346
2347 return result;
2348}
2349
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002350VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2351 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002352 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002353 bool skip_call = false;
2354 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2355 assert(device_data != nullptr);
2356 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002357
Dustin Gravesc900f572016-05-16 11:07:59 -06002358 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002359
Dustin Gravesc900f572016-05-16 11:07:59 -06002360 if (pCreateInfo != nullptr) {
2361 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2362 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2363 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2364 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2365 skip_call |=
2366 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2367 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2368 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2369 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002370
Dustin Gravesc900f572016-05-16 11:07:59 -06002371 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2372 // queueFamilyIndexCount uint32_t values
2373 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2374 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2375 __LINE__, REQUIRED_PARAMETER, LayerName,
2376 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2377 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2378 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2379 }
2380
2381 // Ensure that the queue family indices were specified at device creation
2382 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2383 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2384 }
2385 }
2386
2387 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002388 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2389
Dustin Gravesc900f572016-05-16 11:07:59 -06002390 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002391 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002392
2393 return result;
2394}
2395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002396VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2397 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002398 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002399 assert(my_data != NULL);
2400
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002401 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002402
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002403 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002404 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002405 }
2406}
2407
Chia-I Wu01ca2372016-05-13 14:37:49 +08002408VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2409 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002410 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002411 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002412 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002413 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002414
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002415 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002416
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002417 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002418 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2419
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002420 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002421 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002422
2423 return result;
2424}
2425
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002426VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2427 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002429 assert(my_data != NULL);
2430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002431 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002432
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002433 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002434 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002435 }
2436}
2437
Chia-I Wu01ca2372016-05-13 14:37:49 +08002438VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2439 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002440 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2441 bool skip_call = false;
2442 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002443 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002444 debug_report_data *report_data = device_data->report_data;
2445
2446 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2447
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002448 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002449 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002450 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002451 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2452 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2453 skip_call |=
2454 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2455 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2456 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2457 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002458
Dustin Gravesc900f572016-05-16 11:07:59 -06002459 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2460 // queueFamilyIndexCount uint32_t values
2461 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2462 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2463 __LINE__, REQUIRED_PARAMETER, LayerName,
2464 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2465 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2466 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2467 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002468
2469 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2470 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2471 }
2472
2473 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002474 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2475 skip_call |=
2476 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2477 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478
2479 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002480 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002481
2482 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002483 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002484
2485 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2486 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2487 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2488 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002489 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002490 }
2491
2492 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2493 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2494 // extent.height must be equal
2495 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2496 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002497 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2498 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2499 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2500 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002501 }
2502
2503 if (pCreateInfo->extent.depth != 1) {
2504 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002505 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002506 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2507 }
2508 }
2509
2510 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2511 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2512 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002513 skip_call |=
2514 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2515 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2516 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002517 }
2518
2519 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2520 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2521 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2522 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002523 skip_call |=
2524 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2525 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2526 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002527 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002528 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002529
Dustin Gravesf8032f22016-05-11 18:31:44 -06002530 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002531 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2532
Dustin Gravesf8032f22016-05-11 18:31:44 -06002533 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002534 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002535
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002536 return result;
2537}
2538
Chia-I Wu01ca2372016-05-13 14:37:49 +08002539VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002540 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002541 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002542 assert(my_data != NULL);
2543
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002544 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002545
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002546 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002547 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002548 }
2549}
2550
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002551bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2552 if (pSubresource != nullptr) {
2553 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2554 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002555 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 -06002556 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002557 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2558 return false;
2559 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002560 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002561
2562 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002563}
2564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002565VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2566 VkSubresourceLayout *pLayout) {
2567 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002568 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002569 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002571 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002572
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002573 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002574 PreGetImageSubresourceLayout(device, pSubresource);
2575
2576 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002577 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002578}
2579
Chia-I Wu01ca2372016-05-13 14:37:49 +08002580VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2581 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002582 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002583 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002584 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002585 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002586 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002587
Dustin Graves0b70a632016-04-27 17:44:56 -06002588 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002589
Dustin Graves0b70a632016-04-27 17:44:56 -06002590 if (pCreateInfo != nullptr) {
2591 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002592 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2593 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002594 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2595 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2596 "pCreateInfo->subresourceRange.layerCount must be 1",
2597 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2598 }
2599 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002600 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2601 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2602 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002603 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2604 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2605 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2606 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2607 }
2608 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002609 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2610 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002611 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2612 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2613 "pCreateInfo->subresourceRange.layerCount must be 6");
2614 }
2615 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002616 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2617 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002618 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2619 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2620 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2621 }
2622 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2623 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2624 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2625 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2626 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2627 }
2628
Dustin Graves2a80dc62016-07-12 13:57:02 -06002629 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2630 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002631 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2632 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2633 "pCreateInfo->subresourceRange.layerCount must be 1");
2634 }
2635 }
2636 }
2637
2638 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002639 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2640
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002641 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002642 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002643
2644 return result;
2645}
2646
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002647VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2648 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002649 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002650 assert(my_data != NULL);
2651
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002652 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002653
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002654 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002655 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002656 }
2657}
2658
Chia-I Wu01ca2372016-05-13 14:37:49 +08002659VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002660 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002661 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002662 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002663 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002664 assert(my_data != NULL);
2665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002666 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002667
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002668 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002669 result =
2670 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002671
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002672 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002673 }
2674
Michael Lentine03d8e572015-09-15 14:59:14 -05002675 return result;
2676}
2677
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002678VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2679 const VkAllocationCallbacks *pAllocator) {
2680 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002681 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002682 assert(my_data != NULL);
2683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002684 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002685
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002686 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002687 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002688 }
2689}
2690
Chia-I Wu01ca2372016-05-13 14:37:49 +08002691VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002692 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002693 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002694 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002695 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002696 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002698 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002699
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002700 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002701 result =
2702 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002703
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002704 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002705 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002706
2707 return result;
2708}
2709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002710VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2711 const VkAllocationCallbacks *pAllocator) {
2712 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002713 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002714 assert(my_data != NULL);
2715
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002716 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002718 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002719 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002720 }
2721}
2722
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002723VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2724 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002725 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002726 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002727 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002728 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002729
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002730 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002731
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002732 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002733 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2734
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002735 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002736 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002737
2738 return result;
2739}
2740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002741VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2742 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002743 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002744 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002745 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002746 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002748 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002750 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002751 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2752
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002753 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002754 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002755
2756 return result;
2757}
2758
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002759bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002760 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2761
2762 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002763 if (pCreateInfos != nullptr) {
2764 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2765 if (pCreateInfos->basePipelineIndex != -1) {
2766 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002767 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 -06002768 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2770 "pCreateInfos->flags "
2771 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2772 return false;
2773 }
2774 }
2775
2776 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2777 if (pCreateInfos->basePipelineIndex != -1) {
2778 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002779 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002780 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002781 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2782 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2783 "VK_NULL_HANDLE");
2784 return false;
2785 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002786 }
2787 }
2788
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002789 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002790 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002791 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 -06002792 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002793 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2794 "unrecognized enumerator");
2795 return false;
2796 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002797 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002798
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002799 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002800 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002801 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002802 pCreateInfos[i].pStages[j].pName);
2803 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002804 }
2805
2806 return true;
2807}
2808
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002809VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2810 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2811 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002812 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002813 bool skip_call = false;
2814 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2815 assert(device_data != nullptr);
2816 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002817
Dustin Gravesc900f572016-05-16 11:07:59 -06002818 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2819 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002820
Dustin Gravesc900f572016-05-16 11:07:59 -06002821 if (pCreateInfos != nullptr) {
2822 for (uint32_t i = 0; i < createInfoCount; ++i) {
2823 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2824 if (pCreateInfos[i].pTessellationState == nullptr) {
2825 if (pCreateInfos[i].pStages != nullptr) {
2826 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2827 // pTessellationState must not be NULL
2828 bool has_control = false;
2829 bool has_eval = false;
2830
2831 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2832 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2833 has_control = true;
2834 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2835 has_eval = true;
2836 }
2837 }
2838
2839 if (has_control && has_eval) {
2840 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2841 __LINE__, REQUIRED_PARAMETER, LayerName,
2842 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2843 "control shader stage and a tessellation evaluation shader stage, "
2844 "pCreateInfos[%d].pTessellationState must not be NULL",
2845 i, i);
2846 }
2847 }
Dustin Graves629259b2016-05-30 16:14:27 -06002848 } else {
2849 skip_call |=
2850 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002851 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002852
2853 skip_call |=
2854 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2855 pCreateInfos[i].pTessellationState->flags);
2856
2857 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2858 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2859 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2860 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2861 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2862 i);
2863 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002864 }
2865
2866 if (pCreateInfos[i].pViewportState == nullptr) {
2867 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2868 // valid VkPipelineViewportStateCreateInfo structure
2869 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2870 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2871 skip_call |= log_msg(
2872 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2873 REQUIRED_PARAMETER, LayerName,
2874 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2875 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2876 i, i);
2877 }
2878 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002879 skip_call |=
2880 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002881 pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002882
2883 skip_call |=
2884 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2885 pCreateInfos[i].pViewportState->flags);
2886
Dustin Gravesc900f572016-05-16 11:07:59 -06002887 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2888 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2889 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2890 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2891 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2892 i);
2893 }
2894
2895 if (pCreateInfos[i].pDynamicState != nullptr) {
2896 bool has_dynamic_viewport = false;
2897 bool has_dynamic_scissor = false;
2898
2899 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2900 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2901 has_dynamic_viewport = true;
2902 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2903 has_dynamic_scissor = true;
2904 }
2905 }
2906
2907 // viewportCount must be greater than 0
2908 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2909 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2910 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2911 __LINE__, REQUIRED_PARAMETER, LayerName,
2912 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2913 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2914 "must be greater than 0",
2915 i, i);
2916 }
2917
2918 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2919 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2920 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2921 skip_call |=
2922 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2923 __LINE__, REQUIRED_PARAMETER, LayerName,
2924 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2925 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2926 i, i);
2927 }
2928
2929 // scissorCount must be greater than 0
2930 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2931 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2932 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2933 __LINE__, REQUIRED_PARAMETER, LayerName,
2934 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2935 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2936 "must be greater than 0",
2937 i, i);
2938 }
2939
2940 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2941 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2942 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2943 skip_call |=
2944 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2945 __LINE__, REQUIRED_PARAMETER, LayerName,
2946 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2947 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2948 i, i);
2949 }
2950 }
2951 }
2952
2953 if (pCreateInfos[i].pMultisampleState == nullptr) {
2954 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2955 // a valid VkPipelineMultisampleStateCreateInfo structure
2956 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2957 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2958 skip_call |=
2959 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2960 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2961 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2962 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2963 i, i);
2964 }
Dustin Graves629259b2016-05-30 16:14:27 -06002965 } else {
2966 skip_call |=
2967 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002968 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002969
2970 skip_call |=
2971 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2972 pCreateInfos[i].pMultisampleState->flags);
2973
2974 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2975 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2976 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2977
2978 skip_call |= validate_array(
2979 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2980 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2981 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2982
2983 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2984 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2985 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2986
2987 skip_call |=
2988 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2989 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
2990
2991 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2992 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2993 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2994 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2995 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2996 i);
2997 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002998 }
2999
3000 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003001 if (pCreateInfos[i].pDepthStencilState != nullptr) {
3002 skip_call |=
3003 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003004 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003005
3006 skip_call |=
3007 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
3008 pCreateInfos[i].pDepthStencilState->flags);
3009
3010 skip_call |=
3011 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
3012 pCreateInfos[i].pDepthStencilState->depthTestEnable);
3013
3014 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3015 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
3016 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
3017
3018 skip_call |= validate_ranged_enum(
3019 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
3020 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
3021
3022 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3023 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
3024 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
3025
3026 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3027 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
3028 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
3029
3030 skip_call |= validate_ranged_enum(
3031 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
3032 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
3033
3034 skip_call |= validate_ranged_enum(
3035 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
3036 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
3037
3038 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3039 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
3040 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3041 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
3042
3043 skip_call |= validate_ranged_enum(
3044 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
3045 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
3046
3047 skip_call |= validate_ranged_enum(
3048 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
3049 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3050
3051 skip_call |= validate_ranged_enum(
3052 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
3053 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3054
3055 skip_call |= validate_ranged_enum(
3056 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
3057 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3058
3059 skip_call |= validate_ranged_enum(
3060 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3061 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3062
3063 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3064 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3065 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3066 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3067 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3068 i);
3069 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003070 }
3071
3072 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3073 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003074 skip_call |=
3075 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003076 pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003077
3078 skip_call |=
3079 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3080 pCreateInfos[i].pColorBlendState->flags);
3081
3082 skip_call |=
3083 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3084 pCreateInfos[i].pColorBlendState->logicOpEnable);
3085
3086 skip_call |= validate_array(
3087 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3088 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3089 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3090
3091 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3092 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3093 ++attachmentIndex) {
3094 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3095 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3096 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3097
3098 skip_call |= validate_ranged_enum(
3099 report_data, "vkCreateGraphicsPipelines",
3100 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3101 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3102 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3103
3104 skip_call |= validate_ranged_enum(
3105 report_data, "vkCreateGraphicsPipelines",
3106 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3107 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3108 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3109
3110 skip_call |= validate_ranged_enum(
3111 report_data, "vkCreateGraphicsPipelines",
3112 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3113 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3114
3115 skip_call |= validate_ranged_enum(
3116 report_data, "vkCreateGraphicsPipelines",
3117 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3118 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3119 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3120
3121 skip_call |= validate_ranged_enum(
3122 report_data, "vkCreateGraphicsPipelines",
3123 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3124 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3125 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3126
3127 skip_call |= validate_ranged_enum(
3128 report_data, "vkCreateGraphicsPipelines",
3129 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3130 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3131
3132 skip_call |=
3133 validate_flags(report_data, "vkCreateGraphicsPipelines",
3134 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3135 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3136 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3137 }
3138 }
3139
Dustin Gravesc900f572016-05-16 11:07:59 -06003140 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3141 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3142 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3143 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3144 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3145 i);
3146 }
3147
3148 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3149 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3150 skip_call |= validate_ranged_enum(
3151 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3152 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3153 }
3154 }
3155 }
3156 }
3157
3158 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003159 PreCreateGraphicsPipelines(device, pCreateInfos);
3160
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003161 result = get_dispatch_table(pc_device_table_map, device)
3162 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003163
Dustin Gravesc900f572016-05-16 11:07:59 -06003164 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003165 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003166
3167 return result;
3168}
3169
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003170bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003171 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3172
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003173 if (pCreateInfos != nullptr) {
3174 // TODO: Handle count!
3175 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003176 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003177 }
3178
3179 return true;
3180}
3181
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003182VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3183 const VkComputePipelineCreateInfo *pCreateInfos,
3184 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003185 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003186 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003187 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003188 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003189
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003190 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3191 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003192
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003193 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003194 PreCreateComputePipelines(device, pCreateInfos);
3195
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003196 result = get_dispatch_table(pc_device_table_map, device)
3197 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003198
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003199 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003200 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003201
3202 return result;
3203}
3204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003205VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3206 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003207 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003208 assert(my_data != NULL);
3209
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003210 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003211
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003212 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003213 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003214 }
3215}
3216
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003217VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3218 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003219 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003220 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003221 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003222 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003223
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003224 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003225
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003226 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003227 result =
3228 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003229
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003230 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003231 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003232
3233 return result;
3234}
3235
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003236VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3237 const VkAllocationCallbacks *pAllocator) {
3238 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003239 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003240 assert(my_data != NULL);
3241
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003242 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003243
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003244 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003245 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003246 }
3247}
3248
Chia-I Wu01ca2372016-05-13 14:37:49 +08003249VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3250 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003252 bool skip_call = false;
3253 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3254 assert(device_data != NULL);
3255 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003256
Dustin Gravesc900f572016-05-16 11:07:59 -06003257 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003258
Dustin Gravesc900f572016-05-16 11:07:59 -06003259 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3260 if (pCreateInfo != nullptr) {
3261 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3262 if (pCreateInfo->compareEnable == VK_TRUE) {
3263 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3264 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3265 }
3266
3267 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3268 // valid VkBorderColor value
3269 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3270 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3271 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3272 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3273 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3274 }
3275 }
3276
3277 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003278 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3279
Dustin Gravesc900f572016-05-16 11:07:59 -06003280 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003281 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003282
3283 return result;
3284}
3285
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003286VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3287 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003288 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003289 assert(my_data != NULL);
3290
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003291 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003292
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003293 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003294 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003295 }
3296}
3297
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003298VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3299 const VkAllocationCallbacks *pAllocator,
3300 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003301 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003302 bool skip_call = false;
3303 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3304 assert(device_data != nullptr);
3305 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003306
Dustin Gravesc900f572016-05-16 11:07:59 -06003307 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003308
Dustin Gravesc900f572016-05-16 11:07:59 -06003309 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3310 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3311 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3312 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3313 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3314 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3315 // valid VkSampler handles
3316 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3317 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3318 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3319 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3320 ++descriptor_index) {
3321 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3322 skip_call |=
3323 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3324 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3325 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3326 " specified as VK_NULL_HANDLE",
3327 i, descriptor_index);
3328 }
3329 }
3330 }
3331
3332 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3333 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3334 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3335 skip_call |=
3336 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3337 UNRECOGNIZED_VALUE, LayerName,
3338 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3339 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3340 i, i);
3341 }
3342 }
3343 }
3344 }
3345
3346 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003347 result =
3348 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003349
Dustin Gravesc900f572016-05-16 11:07:59 -06003350 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003351 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003352
3353 return result;
3354}
3355
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003356VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3357 const VkAllocationCallbacks *pAllocator) {
3358 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003359 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003360 assert(my_data != NULL);
3361
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003362 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003363
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003364 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003365 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003366 }
3367}
3368
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003369VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3370 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003371 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003372 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003373 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003374 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003375
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003376 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003377
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003378 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3379
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003380 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003381 result =
3382 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003383
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003384 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003385 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003386
3387 return result;
3388}
3389
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003390VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3391 const VkAllocationCallbacks *pAllocator) {
3392 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003393 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003394 assert(my_data != NULL);
3395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003396 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003397
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003398 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003399 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003400 }
3401}
3402
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003403VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3404 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003405 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003406 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003407 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3408 assert(my_data != NULL);
3409
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003410 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003411
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003412 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003413 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3414
3415 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3416 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003417
3418 return result;
3419}
3420
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003421VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3422 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003423 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003424 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003426 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003428 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003430 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003431 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3432
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003433 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003434 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003435
3436 return result;
3437}
3438
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003439VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003440 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003441 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003442 bool skip_call = false;
3443 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3444 assert(device_data != nullptr);
3445 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003446
Dustin Gravesc900f572016-05-16 11:07:59 -06003447 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003448
Dustin Gravesc900f572016-05-16 11:07:59 -06003449 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3450 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3451 // validate_array()
3452 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3453 pDescriptorSets, true, true);
3454
3455 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003456 result = get_dispatch_table(pc_device_table_map, device)
3457 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003458
Dustin Gravesc900f572016-05-16 11:07:59 -06003459 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003460 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003461
3462 return result;
3463}
3464
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003465VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3466 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3467 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003468 bool skip_call = false;
3469 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3470 assert(device_data != NULL);
3471 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003472
Dustin Gravesc900f572016-05-16 11:07:59 -06003473 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3474 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003475
Dustin Gravesc900f572016-05-16 11:07:59 -06003476 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3477 if (pDescriptorWrites != NULL) {
3478 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3479 // descriptorCount must be greater than 0
3480 if (pDescriptorWrites[i].descriptorCount == 0) {
3481 skip_call |=
3482 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3483 REQUIRED_PARAMETER, LayerName,
3484 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3485 }
3486
3487 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3488 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3489 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3490 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3491 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3492 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3493 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3494 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3495 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3496 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3497 __LINE__, REQUIRED_PARAMETER, LayerName,
3498 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3499 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3500 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3501 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3502 i, i);
3503 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3504 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3505 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3506 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3507 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3508 ++descriptor_index) {
3509 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3510 "pDescriptorWrites[i].pImageInfo[i].imageView",
3511 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3512 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3513 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3514 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3515 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3516 }
3517 }
3518 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3519 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3520 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3521 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3522 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3523 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3524 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3525 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3526 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3527 __LINE__, REQUIRED_PARAMETER, LayerName,
3528 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3529 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3530 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3531 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3532 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003533 } else {
3534 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3535 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3536 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3537 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3538 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003539 }
3540 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3541 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3542 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3543 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3544 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3545 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3546 __LINE__, REQUIRED_PARAMETER, LayerName,
3547 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3548 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3549 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3550 i, i);
3551 } else {
3552 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3553 ++descriptor_index) {
3554 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3555 "pDescriptorWrites[i].pTexelBufferView[i]",
3556 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3557 }
3558 }
3559 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003560
3561 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3562 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3563 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3564 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3565 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3566 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3567 skip_call |=
3568 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003569 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003570 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3571 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3572 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3573 }
3574 }
3575 }
3576 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3577 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3578 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3579 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3580 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3581 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3582 skip_call |=
3583 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003584 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003585 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3586 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3587 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3588 }
3589 }
3590 }
3591 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003592 }
3593 }
3594
3595 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003596 get_dispatch_table(pc_device_table_map, device)
3597 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003599}
3600
Chia-I Wu01ca2372016-05-13 14:37:49 +08003601VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003602 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003603 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003604 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003605 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003606 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003607
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003608 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003609
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003610 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003611 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3612
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003613 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003614 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003615
3616 return result;
3617}
3618
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003619VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3620 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003621 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003622 assert(my_data != NULL);
3623
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003624 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003625
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003626 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003627 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003628 }
3629}
3630
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003631bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3632 bool skip_call = false;
3633 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3634
3635 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3636 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3637 skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003638 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003639 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3640 }
3641 }
3642 return skip_call;
3643}
3644
Chia-I Wu01ca2372016-05-13 14:37:49 +08003645VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003646 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003647 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003648 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003649 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003650 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003651
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003652 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3653 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003654
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003655 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003656 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3657
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003658 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003659 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003660
3661 return result;
3662}
3663
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003664VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3665 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003666 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003667 assert(my_data != NULL);
3668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003669 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003671 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003672 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003673 }
3674}
3675
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003676VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3677 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003679 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003681 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003682
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003683 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003685 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003686}
3687
Chia-I Wu01ca2372016-05-13 14:37:49 +08003688VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003689 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003690 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003691 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003692 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003693 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003694
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003695 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003696 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003698 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003699
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003700 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003701 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3702
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003703 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003704 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003705
3706 return result;
3707}
3708
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003709VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3710 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003711 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003712 assert(my_data != NULL);
3713
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003714 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003715
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003716 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003717 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003718 }
3719}
3720
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003721VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003722 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003723 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3725 assert(my_data != NULL);
3726
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003727 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003729 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003730 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3731
3732 validate_result(my_data->report_data, "vkResetCommandPool", result);
3733 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003734
3735 return result;
3736}
3737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003738VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3739 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003740 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003741 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003742 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003743 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003744
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003745 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003747 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003748 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3749
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003750 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003751 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003752
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003753 return result;
3754}
3755
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003756VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003757 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003758 bool skip_call = false;
3759 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3760 assert(device_data != nullptr);
3761 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003762
Dustin Gravesc900f572016-05-16 11:07:59 -06003763 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003764
Dustin Gravesc900f572016-05-16 11:07:59 -06003765 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3766 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3767 // validate_array()
3768 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3769 pCommandBuffers, true, true);
3770
3771 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003772 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003773 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003774 }
3775}
3776
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003777bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3778 bool skip_call = false;
3779 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3780 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3781
3782 if (pInfo != NULL) {
3783 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3784 skip_call |=
3785 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 -06003786 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003787 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3788 "inheritedQueries.");
3789 }
3790
3791 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3792 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3793 skip_call |=
3794 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 -06003795 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003796 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3797 "valid combination of VkQueryControlFlagBits.",
3798 pInfo->queryFlags);
3799 }
3800 }
3801 return skip_call;
3802}
3803
3804VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003805 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003806 bool skip_call = false;
3807 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3808 assert(device_data != nullptr);
3809 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003810
Dustin Gravesc900f572016-05-16 11:07:59 -06003811 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003812
Dustin Gravesc900f572016-05-16 11:07:59 -06003813 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3814 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3815 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3816 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3817 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3818
3819 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003820 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003821 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003822
3823 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3824 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3825
Dustin Gravesc900f572016-05-16 11:07:59 -06003826 // TODO: This only needs to be validated when the inherited queries feature is enabled
3827 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3828 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3829
3830 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3831 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3832 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3833 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3834 }
3835
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003836 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3837
Dustin Gravesc900f572016-05-16 11:07:59 -06003838 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003839 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3840
Dustin Gravesc900f572016-05-16 11:07:59 -06003841 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003842 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003843
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003844 return result;
3845}
3846
Chia-I Wu01ca2372016-05-13 14:37:49 +08003847VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003848 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3849 assert(my_data != NULL);
3850
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003851 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003852
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003853 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003854
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003855 return result;
3856}
3857
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003858VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003859 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003860 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3861 assert(my_data != NULL);
3862
Dustin Graves16d18972016-05-09 17:36:57 -06003863 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003864
Dustin Graves16d18972016-05-09 17:36:57 -06003865 if (!skip_call) {
3866 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3867
3868 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3869 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003870
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003871 return result;
3872}
3873
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003874VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3875 VkPipeline pipeline) {
3876 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003877 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3878 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003879
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003880 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003881
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003882 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003883 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3884 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003885}
3886
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003887VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3888 const VkViewport *pViewports) {
3889 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003890 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003891 assert(my_data != NULL);
3892
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003893 skip_call |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003894
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003895 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003896 get_dispatch_table(pc_device_table_map, commandBuffer)
3897 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003898 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003899}
3900
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003901VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3902 const VkRect2D *pScissors) {
3903 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003904 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003905 assert(my_data != NULL);
3906
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003907 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003908
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003909 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003910 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3911 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003912}
3913
Chia-I Wu01ca2372016-05-13 14:37:49 +08003914VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003915 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003916}
3917
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003918VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
3919 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003920 get_dispatch_table(pc_device_table_map, commandBuffer)
3921 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003922}
3923
Chia-I Wu01ca2372016-05-13 14:37:49 +08003924VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003925 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003926 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003927 assert(my_data != NULL);
3928
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003929 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003930
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003931 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003932 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3933 }
Cody Northrop12365112015-08-17 11:10:49 -06003934}
3935
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003936VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003937 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003938}
3939
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003940VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
3941 uint32_t compareMask) {
3942 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003943 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3944 assert(my_data != NULL);
3945
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003946 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06003947
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003948 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003949 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3950 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003951}
3952
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003953VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
3954 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3956 assert(my_data != NULL);
3957
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003958 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06003959
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003960 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003961 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3962 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003963}
3964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003965VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
3966 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003967 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3968 assert(my_data != NULL);
3969
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003970 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06003971
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003972 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003973 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3974 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003975}
3976
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003977VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3978 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
3979 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
3980 const uint32_t *pDynamicOffsets) {
3981 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003982 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003983 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003984
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003985 skip_call |=
3986 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
3987 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003988
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003989 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003990 get_dispatch_table(pc_device_table_map, commandBuffer)
3991 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3992 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003993 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003994}
3995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003996VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3997 VkIndexType indexType) {
3998 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003999 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4000 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004001
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004002 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004003
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004004 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004005 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4006 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004007}
4008
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004009VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4010 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4011 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004012 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004013 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004014
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004015 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004016
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004017 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004018 get_dispatch_table(pc_device_table_map, commandBuffer)
4019 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004020 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004021}
4022
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004023bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4024 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004025 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004026 // 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 -07004027 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004028 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 -06004029 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004030 return false;
4031 }
4032
4033 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004034 // 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 -07004035 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004036 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 -06004037 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004038 return false;
4039 }
4040
4041 return true;
4042}
4043
Chia-I Wu01ca2372016-05-13 14:37:49 +08004044VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4045 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004046 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004047
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004048 get_dispatch_table(pc_device_table_map, commandBuffer)
4049 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004050}
4051
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004052VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4053 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004054 get_dispatch_table(pc_device_table_map, commandBuffer)
4055 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004056}
4057
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004058VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4059 uint32_t stride) {
4060 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004061 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4062 assert(my_data != NULL);
4063
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004064 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004065
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004066 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004067 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4068 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004069}
4070
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004071VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4072 uint32_t count, uint32_t stride) {
4073 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004074 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4075 assert(my_data != NULL);
4076
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004077 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004078
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004079 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004080 get_dispatch_table(pc_device_table_map, commandBuffer)
4081 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4082 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004083}
4084
Chia-I Wu01ca2372016-05-13 14:37:49 +08004085VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004086 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004087}
4088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004089VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4090 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004091 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4092 assert(my_data != NULL);
4093
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004094 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004095
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004096 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004097 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4098 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004099}
4100
Chia-I Wu01ca2372016-05-13 14:37:49 +08004101VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4102 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004103 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004104 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004105 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004107 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004108
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004109 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004110 get_dispatch_table(pc_device_table_map, commandBuffer)
4111 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004112 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004113}
4114
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004115bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4116 if (pRegions != nullptr) {
4117 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4118 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004119 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 -06004120 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004121 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4122 return false;
4123 }
4124 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4125 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004126 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 -06004127 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004128 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4129 return false;
4130 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004131 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004132
4133 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004134}
4135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004136VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4137 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4138 const VkImageCopy *pRegions) {
4139 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004140 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004141 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004142
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004143 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4144 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004145
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004146 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004147 PreCmdCopyImage(commandBuffer, pRegions);
4148
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004149 get_dispatch_table(pc_device_table_map, commandBuffer)
4150 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004151 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004152}
4153
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004154bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4155 if (pRegions != nullptr) {
4156 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4157 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004158 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 -06004159 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004160 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4161 return false;
4162 }
4163 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4164 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004165 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 -06004166 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004167 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4168 return false;
4169 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004170 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004171
4172 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004173}
4174
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004175VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4176 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4177 const VkImageBlit *pRegions, VkFilter filter) {
4178 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004179 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004180 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004181
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004182 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4183 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004184
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004185 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004186 PreCmdBlitImage(commandBuffer, pRegions);
4187
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004188 get_dispatch_table(pc_device_table_map, commandBuffer)
4189 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004190 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004191}
4192
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004193bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4194 if (pRegions != nullptr) {
4195 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4196 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004197 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 -06004198 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004199 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4200 "enumerator");
4201 return false;
4202 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004203 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004204
4205 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004206}
4207
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004208VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4209 VkImageLayout dstImageLayout, uint32_t regionCount,
4210 const VkBufferImageCopy *pRegions) {
4211 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004212 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004213 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004214
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004215 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4216 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004217
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004218 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004219 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4220
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004221 get_dispatch_table(pc_device_table_map, commandBuffer)
4222 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004224}
4225
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004226bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4227 if (pRegions != nullptr) {
4228 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4229 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004230 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 -06004231 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004232 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4233 "enumerator");
4234 return false;
4235 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004236 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004237
4238 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004239}
4240
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004241VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4242 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4243 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004245 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004246
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004247 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4248 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004249
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004250 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004251 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4252
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004253 get_dispatch_table(pc_device_table_map, commandBuffer)
4254 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004255 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004256}
4257
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004258VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4259 VkDeviceSize dataSize, const uint32_t *pData) {
4260 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004262 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004263
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004264 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004265
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004266 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004267 skip_call |= log_msg(
4268 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4269 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004270 }
4271
4272 if ((dataSize <= 0) || (dataSize > 65536)) {
4273 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 -06004274 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4275 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004276 dataSize);
4277 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004278 skip_call |= log_msg(
4279 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4280 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004281 }
4282
4283 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004284 get_dispatch_table(pc_device_table_map, commandBuffer)
4285 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004286 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004287}
4288
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004289VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4290 VkDeviceSize size, uint32_t data) {
4291 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004292 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4293 assert(my_data != NULL);
4294
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004295 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004296
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004297 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004298 skip_call |= log_msg(
4299 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4300 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004301 }
4302
4303 if (size != VK_WHOLE_SIZE) {
4304 if (size <= 0) {
4305 skip_call |= log_msg(
4306 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004307 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004308 } else if (size & 3) {
4309 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 -06004310 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004311 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4312 }
4313 }
4314
4315 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004316 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4317 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004318}
4319
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004320VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4321 const VkClearColorValue *pColor, uint32_t rangeCount,
4322 const VkImageSubresourceRange *pRanges) {
4323 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004325 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004326
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004327 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004329 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004330 get_dispatch_table(pc_device_table_map, commandBuffer)
4331 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004332 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004333}
4334
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004335VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4336 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4337 const VkImageSubresourceRange *pRanges) {
4338 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004339 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004340 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004341
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004342 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4343 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004344
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004345 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004346 get_dispatch_table(pc_device_table_map, commandBuffer)
4347 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004348 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004349}
4350
Chia-I Wu01ca2372016-05-13 14:37:49 +08004351VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4352 const VkClearAttachment *pAttachments, uint32_t rectCount,
4353 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004354 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004355 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004356 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004357
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004358 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004359
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004360 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004361 get_dispatch_table(pc_device_table_map, commandBuffer)
4362 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004363 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004364}
4365
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004366bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4367 if (pRegions != nullptr) {
4368 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4369 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4370 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004371 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004372 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004373 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4374 return false;
4375 }
4376 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4377 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4378 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004379 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004380 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004381 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4382 return false;
4383 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004384 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004385
4386 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004387}
4388
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004389VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4390 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4391 const VkImageResolve *pRegions) {
4392 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004393 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004394 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004396 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4397 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004398
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004399 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004400 PreCmdResolveImage(commandBuffer, pRegions);
4401
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004402 get_dispatch_table(pc_device_table_map, commandBuffer)
4403 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004404 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004405}
4406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004407VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4408 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004409 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4410 assert(my_data != NULL);
4411
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004412 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004413
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004414 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004415 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4416 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004417}
4418
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004419VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4420 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004421 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4422 assert(my_data != NULL);
4423
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004424 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004425
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004426 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004427 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4428 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004429}
4430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004431VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4432 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4433 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4434 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4435 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4436 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004437 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004438 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004439
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004440 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4441 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4442 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004443
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004444 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004445 get_dispatch_table(pc_device_table_map, commandBuffer)
4446 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4447 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004448 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449}
4450
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004451VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4452 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4453 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4454 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4455 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4456 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004457 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004458 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004459
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004460 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4461 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4462 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004464 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004465 get_dispatch_table(pc_device_table_map, commandBuffer)
4466 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4467 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004468 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004469}
4470
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004471VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4472 VkQueryControlFlags flags) {
4473 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004474 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4475 assert(my_data != NULL);
4476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004477 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004478
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004479 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004480 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4481 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004482}
4483
Chia-I Wu01ca2372016-05-13 14:37:49 +08004484VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004485 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4487 assert(my_data != NULL);
4488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004489 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004491 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004492 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4493 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004494}
4495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004496VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4497 uint32_t queryCount) {
4498 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004499 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4500 assert(my_data != NULL);
4501
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004502 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004503
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004504 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004505 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4506 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004507}
4508
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004509bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4510 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004511
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004512 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004513
4514 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004515}
4516
Chia-I Wu01ca2372016-05-13 14:37:49 +08004517VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4518 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004519 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004520 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4521 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004523 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004524
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004525 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004526 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4527
4528 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4529 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004530}
4531
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004532VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4533 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4534 VkDeviceSize stride, VkQueryResultFlags flags) {
4535 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004536 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4537 assert(my_data != NULL);
4538
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004539 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4540 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004541
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004542 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004543 get_dispatch_table(pc_device_table_map, commandBuffer)
4544 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4545 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004546}
4547
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004548VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4549 uint32_t offset, uint32_t size, const void *pValues) {
4550 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004551 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004552 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004554 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004555
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004556 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004557 get_dispatch_table(pc_device_table_map, commandBuffer)
4558 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004559 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004560}
4561
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004562VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4563 VkSubpassContents contents) {
4564 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004565 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004566 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004567
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004568 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004569
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004570 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004571 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004572 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004573}
4574
Chia-I Wu01ca2372016-05-13 14:37:49 +08004575VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004576 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004577 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4578 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004579
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004580 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004581
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004582 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004583 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4584 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004585}
4586
Chia-I Wu01ca2372016-05-13 14:37:49 +08004587VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004588 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004589}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004590
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004591VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4592 const VkCommandBuffer *pCommandBuffers) {
4593 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004594 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004595 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004596
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004597 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004598
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004599 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004600 get_dispatch_table(pc_device_table_map, commandBuffer)
4601 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004602 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004603}
4604
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004605VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004606 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4607}
4608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004609VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4610 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004611 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4612}
4613
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004614VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4615 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004616 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4617 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4618
4619 return VK_ERROR_LAYER_NOT_PRESENT;
4620}
4621
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004622VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4623 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004624 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004625 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004626 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004627
4628 assert(physicalDevice);
4629
4630 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4631 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004632}
4633
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004634// WSI Extension Functions
4635
4636VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004637 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004638 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004639 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004640 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4641 assert(my_data != NULL);
4642
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004643 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004644
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004645 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004646 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4647
4648 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4649 }
4650
4651 return result;
4652}
4653
4654VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004655 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004656 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004657 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4659 assert(my_data != NULL);
4660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004661 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004662 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4663
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004664 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004665 result = get_dispatch_table(pc_device_table_map, device)
4666 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4667
4668 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4669 }
4670
4671 return result;
4672}
4673
4674VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004675 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004676 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004677 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4679 assert(my_data != NULL);
4680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004681 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004682 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004684 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004685 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004686 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004687
4688 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4689 }
4690
4691 return result;
4692}
4693
4694VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4695 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004696 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004697 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4698 assert(my_data != NULL);
4699
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004700 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004702 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004703 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4704
4705 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4706 }
4707
4708 return result;
4709}
4710
4711VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4712 VkSurfaceKHR surface, VkBool32 *pSupported) {
4713 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004714 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004715 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4716 assert(my_data != NULL);
4717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004718 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004719 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4720
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004721 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004722 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4723 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4724
4725 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4726 }
4727
4728 return result;
4729}
4730
4731VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4732 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4733 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004734 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004735 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4736 assert(my_data != NULL);
4737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004738 skip_call |=
4739 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004741 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004742 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4743 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4744
4745 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4746 }
4747
4748 return result;
4749}
4750
4751VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4752 uint32_t *pSurfaceFormatCount,
4753 VkSurfaceFormatKHR *pSurfaceFormats) {
4754 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004755 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004756 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4757 assert(my_data != NULL);
4758
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004759 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4760 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004761
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004762 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004763 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4764 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4765
4766 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4767 }
4768
4769 return result;
4770}
4771
4772VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4773 uint32_t *pPresentModeCount,
4774 VkPresentModeKHR *pPresentModes) {
4775 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004776 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004777 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4778 assert(my_data != NULL);
4779
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004780 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4781 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004783 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004784 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4785 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4786
4787 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4788 }
4789
4790 return result;
4791}
4792
4793#ifdef VK_USE_PLATFORM_WIN32_KHR
4794VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4795 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4796 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4797
4798 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4799 assert(my_data != NULL);
4800
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004801 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004802
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004803 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804 result =
4805 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4806 }
4807
4808 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4809
4810 return result;
4811}
4812#endif // VK_USE_PLATFORM_WIN32_KHR
4813
4814#ifdef VK_USE_PLATFORM_XCB_KHR
4815VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4816 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4817 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4818
4819 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4820 assert(my_data != NULL);
4821
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004822 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004823
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004824 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004825 result =
4826 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4827 }
4828
4829 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4830
4831 return result;
4832}
4833
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004834VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4835 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4836 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004837 VkBool32 result = false;
4838
4839 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4840 assert(my_data != NULL);
4841
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004842 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4843 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004844
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004845 if (!skip_call) {
4846 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4847 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004848 }
4849
4850 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004851}
4852#endif // VK_USE_PLATFORM_XCB_KHR
4853
4854#ifdef VK_USE_PLATFORM_XLIB_KHR
4855VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004856 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004857 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4858
4859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4860 assert(my_data != NULL);
4861
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004862 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004863
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004864 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004865 result =
4866 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4867 }
4868
4869 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4870
4871 return result;
4872}
4873
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004874VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4875 uint32_t queueFamilyIndex, Display *dpy,
4876 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004877 VkBool32 result = false;
4878
4879 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4880 assert(my_data != NULL);
4881
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004882 bool skip_call =
4883 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004885 if (!skip_call) {
4886 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4887 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004888 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004889}
4890#endif // VK_USE_PLATFORM_XLIB_KHR
4891
4892#ifdef VK_USE_PLATFORM_MIR_KHR
4893VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004894 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004895 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4896
4897 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4898 assert(my_data != NULL);
4899
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004900 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004901
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004902 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004903 result =
4904 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4905 }
4906
4907 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4908
4909 return result;
4910}
4911
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004912VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4913 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004914 VkBool32 result = false;
4915
4916 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4917 assert(my_data != NULL);
4918
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004919 bool skip_call =
4920 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004921
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004922 if (!skip_call) {
4923 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4924 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004925 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004926}
4927#endif // VK_USE_PLATFORM_MIR_KHR
4928
4929#ifdef VK_USE_PLATFORM_WAYLAND_KHR
4930VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004931 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004932 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4933
4934 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4935 assert(my_data != NULL);
4936
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004937 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004939 if (!skip_call) {
4940 result = get_dispatch_table(pc_instance_table_map, instance)
4941 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 }
4943
4944 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
4945
4946 return result;
4947}
4948
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004949VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4950 uint32_t queueFamilyIndex,
4951 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004952 VkBool32 result = false;
4953
4954 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4955 assert(my_data != NULL);
4956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004957 bool skip_call =
4958 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004959
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004960 if (!skip_call) {
4961 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4962 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004963 }
4964}
4965#endif // VK_USE_PLATFORM_WAYLAND_KHR
4966
4967#ifdef VK_USE_PLATFORM_ANDROID_KHR
4968VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004969 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004970 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4971
4972 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4973 assert(my_data != NULL);
4974
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004975 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004976
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004977 if (!skip_call) {
4978 result = get_dispatch_table(pc_instance_table_map, instance)
4979 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004980 }
4981
4982 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
4983
4984 return result;
4985}
4986#endif // VK_USE_PLATFORM_ANDROID_KHR
4987
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004988static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004990static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004991
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004992static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004993
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004994static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004995
Chia-I Wu01ca2372016-05-13 14:37:49 +08004996VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08004997 assert(device);
4998
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004999 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5000
Dustin Graves080069b2016-04-05 13:48:15 -06005001 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005002 return NULL;
5003 }
5004
Chia-I Wuf9b01382016-05-16 07:37:41 +08005005 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5006 if (proc)
5007 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005008
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005009 proc = InterceptWsiEnabledCommand(funcName, device);
5010 if (proc)
5011 return proc;
5012
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005013 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005014 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005015 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005016}
5017
Chia-I Wu01ca2372016-05-13 14:37:49 +08005018VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005019 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005020 if (!proc)
5021 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005022
5023 if (!proc)
5024 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005025
Chia-I Wu617f2a42016-05-16 07:41:17 +08005026 if (proc)
5027 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005028
Chia-I Wu617f2a42016-05-16 07:41:17 +08005029 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005030
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005031 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005032
Chia-I Wu617f2a42016-05-16 07:41:17 +08005033 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005034 if (!proc)
5035 proc = InterceptWsiEnabledCommand(funcName, instance);
5036
Chia-I Wu617f2a42016-05-16 07:41:17 +08005037 if (proc)
5038 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005039
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005040 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005041 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005042 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005043}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005045static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005046 static const struct {
5047 const char *name;
5048 PFN_vkVoidFunction proc;
5049 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005050 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5051 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5052 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5053 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5054 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5055 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5056 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5057 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5058 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5059 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5060 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5061 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5062 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5063 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5064 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5065 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5066 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Chia-I Wu617f2a42016-05-16 07:41:17 +08005067 };
5068
5069 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5070 if (!strcmp(core_instance_commands[i].name, name))
5071 return core_instance_commands[i].proc;
5072 }
5073
5074 return nullptr;
5075}
5076
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005077static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005078 static const struct {
5079 const char *name;
5080 PFN_vkVoidFunction proc;
5081 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005082 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5083 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5084 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5085 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5086 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5087 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5088 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5089 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5090 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5091 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5092 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5093 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5094 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5095 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5096 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5097 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5098 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5099 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5100 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5101 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5102 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5103 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5104 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5105 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5106 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5107 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5108 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5109 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5110 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5111 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5112 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5113 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5114 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5115 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5116 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5117 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5118 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5119 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5120 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5121 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5122 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5123 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5124 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5125 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5126 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5127 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5128 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5129 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5130 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5131 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5132 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5133 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5134 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5135 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5136 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5137 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5138 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5139 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5140 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5141 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5142 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5143 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5144 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5145 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5146 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5147 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5148 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5149 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5150 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5151 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5152 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5153 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5154 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5155 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5156 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5157 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5158 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5159 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5160 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5161 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5162 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5163 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5164 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5165 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5166 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5167 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5168 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5169 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5170 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5171 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5172 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5173 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5174 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5175 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5176 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5177 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5178 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5179 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5180 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5181 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5182 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5183 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5184 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5185 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5186 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5187 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5188 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5189 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5190 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5191 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5192 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5193 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5194 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5195 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5196 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5197 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5198 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Chia-I Wuf9b01382016-05-16 07:37:41 +08005199 };
5200
5201 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5202 if (!strcmp(core_device_commands[i].name, name))
5203 return core_device_commands[i].proc;
5204 }
5205
5206 return nullptr;
5207}
5208
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005209static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005210 static const struct {
5211 const char *name;
5212 PFN_vkVoidFunction proc;
5213 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005214 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5215 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5216 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5217 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005218 };
5219
5220 if (device) {
5221 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5222 if (!device_data->wsi_enabled)
5223 return nullptr;
5224 }
5225
5226 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5227 if (!strcmp(wsi_device_commands[i].name, name))
5228 return wsi_device_commands[i].proc;
5229 }
5230
5231 return nullptr;
5232}
5233
5234static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5235 static const struct {
5236 const char *name;
5237 PFN_vkVoidFunction proc;
5238 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005239 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5240 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5241 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5242 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5243 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5244 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005245 };
5246
5247 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005248 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005249 return nullptr;
5250
5251 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5252 if (!strcmp(wsi_instance_commands[i].name, name))
5253 return wsi_instance_commands[i].proc;
5254 }
5255
5256#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005257 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005258 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5259#endif // VK_USE_PLATFORM_WIN32_KHR
5260#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005261 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005262 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005263 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005264 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5265#endif // VK_USE_PLATFORM_XCB_KHR
5266#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005267 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005268 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005269 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005270 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5271#endif // VK_USE_PLATFORM_XLIB_KHR
5272#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005273 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005274 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005275 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005276 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5277#endif // VK_USE_PLATFORM_MIR_KHR
5278#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005279 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005280 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005281 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5282 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005283 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5284#endif // VK_USE_PLATFORM_WAYLAND_KHR
5285#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005286 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005287 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5288#endif // VK_USE_PLATFORM_ANDROID_KHR
5289
5290 return nullptr;
5291}
5292
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005293} // namespace parameter_validation
5294
5295// vk_layer_logging.h expects these to be defined
5296
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005297VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5298 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5299 const VkAllocationCallbacks *pAllocator,
5300 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005301 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005302}
5303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005304VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5305 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005306 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005307}
5308
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005309VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5310 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5311 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005312 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005313}
5314
5315// loader-layer interface v0
5316
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005317VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5318 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005319 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005320}
5321
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005322VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5323 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005324 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005325}
5326
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005327VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5328 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005329 // the layer command handles VK_NULL_HANDLE just fine internally
5330 assert(physicalDevice == VK_NULL_HANDLE);
5331 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005332}
5333
5334VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5335 const char *pLayerName, uint32_t *pCount,
5336 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005337 // the layer command handles VK_NULL_HANDLE just fine internally
5338 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005339 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005340}
5341
5342VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005343 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005344}
5345
5346VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005347 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005348}