blob: b93ded1e31377e6dd49dd3c9986e58ade0b03c8f [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 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002797
2798 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2799 (data->physical_device_features.fillModeNonSolid == false)) {
2800 log_msg(
2801 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2802 DEVICE_FEATURE, LayerName,
2803 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2804 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2805 return false;
2806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002807 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002808
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002810 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002811 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002812 pCreateInfos[i].pStages[j].pName);
2813 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002814 }
2815
2816 return true;
2817}
2818
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002819VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2820 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2821 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002822 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002823 bool skip_call = false;
2824 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2825 assert(device_data != nullptr);
2826 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002827
Dustin Gravesc900f572016-05-16 11:07:59 -06002828 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2829 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002830
Dustin Gravesc900f572016-05-16 11:07:59 -06002831 if (pCreateInfos != nullptr) {
2832 for (uint32_t i = 0; i < createInfoCount; ++i) {
2833 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2834 if (pCreateInfos[i].pTessellationState == nullptr) {
2835 if (pCreateInfos[i].pStages != nullptr) {
2836 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2837 // pTessellationState must not be NULL
2838 bool has_control = false;
2839 bool has_eval = false;
2840
2841 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2842 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2843 has_control = true;
2844 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2845 has_eval = true;
2846 }
2847 }
2848
2849 if (has_control && has_eval) {
2850 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2851 __LINE__, REQUIRED_PARAMETER, LayerName,
2852 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2853 "control shader stage and a tessellation evaluation shader stage, "
2854 "pCreateInfos[%d].pTessellationState must not be NULL",
2855 i, i);
2856 }
2857 }
Dustin Graves629259b2016-05-30 16:14:27 -06002858 } else {
2859 skip_call |=
2860 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002861 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002862
2863 skip_call |=
2864 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2865 pCreateInfos[i].pTessellationState->flags);
2866
2867 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2868 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2869 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2870 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2871 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2872 i);
2873 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002874 }
2875
2876 if (pCreateInfos[i].pViewportState == nullptr) {
2877 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2878 // valid VkPipelineViewportStateCreateInfo structure
2879 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2880 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2881 skip_call |= log_msg(
2882 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2883 REQUIRED_PARAMETER, LayerName,
2884 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2885 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2886 i, i);
2887 }
2888 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002889 skip_call |=
2890 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002891 pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002892
2893 skip_call |=
2894 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2895 pCreateInfos[i].pViewportState->flags);
2896
Dustin Gravesc900f572016-05-16 11:07:59 -06002897 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2898 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2899 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2900 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2901 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2902 i);
2903 }
2904
2905 if (pCreateInfos[i].pDynamicState != nullptr) {
2906 bool has_dynamic_viewport = false;
2907 bool has_dynamic_scissor = false;
2908
2909 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2910 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2911 has_dynamic_viewport = true;
2912 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2913 has_dynamic_scissor = true;
2914 }
2915 }
2916
2917 // viewportCount must be greater than 0
2918 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2919 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2920 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2921 __LINE__, REQUIRED_PARAMETER, LayerName,
2922 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2923 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2924 "must be greater than 0",
2925 i, i);
2926 }
2927
2928 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2929 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2930 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2931 skip_call |=
2932 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 contains "
2935 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2936 i, i);
2937 }
2938
2939 // scissorCount must be greater than 0
2940 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2941 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2942 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2943 __LINE__, REQUIRED_PARAMETER, LayerName,
2944 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2945 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2946 "must be greater than 0",
2947 i, i);
2948 }
2949
2950 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2951 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2952 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2953 skip_call |=
2954 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2955 __LINE__, REQUIRED_PARAMETER, LayerName,
2956 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2957 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2958 i, i);
2959 }
2960 }
2961 }
2962
2963 if (pCreateInfos[i].pMultisampleState == nullptr) {
2964 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2965 // a valid VkPipelineMultisampleStateCreateInfo structure
2966 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2967 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2968 skip_call |=
2969 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2970 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2971 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2972 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2973 i, i);
2974 }
Dustin Graves629259b2016-05-30 16:14:27 -06002975 } else {
2976 skip_call |=
2977 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002978 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002979
2980 skip_call |=
2981 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2982 pCreateInfos[i].pMultisampleState->flags);
2983
2984 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2985 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2986 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2987
2988 skip_call |= validate_array(
2989 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2990 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2991 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2992
2993 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2994 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2995 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2996
2997 skip_call |=
2998 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2999 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
3000
3001 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3002 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3003 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3004 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3005 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3006 i);
3007 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003008 }
3009
3010 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003011 if (pCreateInfos[i].pDepthStencilState != nullptr) {
3012 skip_call |=
3013 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003014 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003015
3016 skip_call |=
3017 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
3018 pCreateInfos[i].pDepthStencilState->flags);
3019
3020 skip_call |=
3021 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
3022 pCreateInfos[i].pDepthStencilState->depthTestEnable);
3023
3024 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3025 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
3026 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
3027
3028 skip_call |= validate_ranged_enum(
3029 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
3030 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
3031
3032 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3033 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
3034 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
3035
3036 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3037 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
3038 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
3039
3040 skip_call |= validate_ranged_enum(
3041 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
3042 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
3043
3044 skip_call |= validate_ranged_enum(
3045 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
3046 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
3047
3048 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3049 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
3050 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3051 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
3052
3053 skip_call |= validate_ranged_enum(
3054 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
3055 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
3056
3057 skip_call |= validate_ranged_enum(
3058 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
3059 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3060
3061 skip_call |= validate_ranged_enum(
3062 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
3063 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3064
3065 skip_call |= validate_ranged_enum(
3066 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
3067 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3068
3069 skip_call |= validate_ranged_enum(
3070 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3071 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3072
3073 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3074 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3075 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3076 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3077 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3078 i);
3079 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003080 }
3081
3082 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3083 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003084 skip_call |=
3085 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003086 pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003087
3088 skip_call |=
3089 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3090 pCreateInfos[i].pColorBlendState->flags);
3091
3092 skip_call |=
3093 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3094 pCreateInfos[i].pColorBlendState->logicOpEnable);
3095
3096 skip_call |= validate_array(
3097 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3098 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3099 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3100
3101 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3102 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3103 ++attachmentIndex) {
3104 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3105 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3106 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3107
3108 skip_call |= validate_ranged_enum(
3109 report_data, "vkCreateGraphicsPipelines",
3110 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3111 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3112 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3113
3114 skip_call |= validate_ranged_enum(
3115 report_data, "vkCreateGraphicsPipelines",
3116 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3117 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3118 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3119
3120 skip_call |= validate_ranged_enum(
3121 report_data, "vkCreateGraphicsPipelines",
3122 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3123 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3124
3125 skip_call |= validate_ranged_enum(
3126 report_data, "vkCreateGraphicsPipelines",
3127 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3128 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3129 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3130
3131 skip_call |= validate_ranged_enum(
3132 report_data, "vkCreateGraphicsPipelines",
3133 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3134 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3135 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3136
3137 skip_call |= validate_ranged_enum(
3138 report_data, "vkCreateGraphicsPipelines",
3139 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3140 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3141
3142 skip_call |=
3143 validate_flags(report_data, "vkCreateGraphicsPipelines",
3144 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3145 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3146 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3147 }
3148 }
3149
Dustin Gravesc900f572016-05-16 11:07:59 -06003150 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3151 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3152 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3153 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3154 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3155 i);
3156 }
3157
3158 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3159 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3160 skip_call |= validate_ranged_enum(
3161 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3162 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3163 }
3164 }
3165 }
3166 }
3167
3168 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003169 PreCreateGraphicsPipelines(device, pCreateInfos);
3170
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003171 result = get_dispatch_table(pc_device_table_map, device)
3172 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003173
Dustin Gravesc900f572016-05-16 11:07:59 -06003174 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003175 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003176
3177 return result;
3178}
3179
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003180bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003181 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003183 if (pCreateInfos != nullptr) {
3184 // TODO: Handle count!
3185 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003186 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003187 }
3188
3189 return true;
3190}
3191
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003192VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3193 const VkComputePipelineCreateInfo *pCreateInfos,
3194 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003195 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003196 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003197 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003198 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003199
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003200 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3201 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003202
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003203 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003204 PreCreateComputePipelines(device, pCreateInfos);
3205
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003206 result = get_dispatch_table(pc_device_table_map, device)
3207 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003208
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003209 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003210 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003211
3212 return result;
3213}
3214
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003215VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3216 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003217 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003218 assert(my_data != NULL);
3219
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003220 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003221
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003222 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003223 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003224 }
3225}
3226
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003227VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3228 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003229 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003230 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003231 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003232 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003233
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003234 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003235
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003236 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003237 result =
3238 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003239
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003240 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003241 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003242
3243 return result;
3244}
3245
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003246VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3247 const VkAllocationCallbacks *pAllocator) {
3248 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003250 assert(my_data != NULL);
3251
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003252 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003253
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003254 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003255 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003256 }
3257}
3258
Chia-I Wu01ca2372016-05-13 14:37:49 +08003259VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3260 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003261 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003262 bool skip_call = false;
3263 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3264 assert(device_data != NULL);
3265 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003266
Dustin Gravesc900f572016-05-16 11:07:59 -06003267 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003268
Dustin Gravesc900f572016-05-16 11:07:59 -06003269 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3270 if (pCreateInfo != nullptr) {
3271 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3272 if (pCreateInfo->compareEnable == VK_TRUE) {
3273 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3274 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3275 }
3276
3277 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3278 // valid VkBorderColor value
3279 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3280 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3281 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3282 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3283 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3284 }
3285 }
3286
3287 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003288 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3289
Dustin Gravesc900f572016-05-16 11:07:59 -06003290 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003292
3293 return result;
3294}
3295
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003296VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3297 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003298 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003299 assert(my_data != NULL);
3300
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003301 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003302
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003303 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003304 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003305 }
3306}
3307
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003308VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3309 const VkAllocationCallbacks *pAllocator,
3310 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003312 bool skip_call = false;
3313 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3314 assert(device_data != nullptr);
3315 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003316
Dustin Gravesc900f572016-05-16 11:07:59 -06003317 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003318
Dustin Gravesc900f572016-05-16 11:07:59 -06003319 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3320 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3321 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3322 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3323 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3324 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3325 // valid VkSampler handles
3326 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3327 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3328 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3329 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3330 ++descriptor_index) {
3331 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3332 skip_call |=
3333 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3334 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3335 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3336 " specified as VK_NULL_HANDLE",
3337 i, descriptor_index);
3338 }
3339 }
3340 }
3341
3342 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3343 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3344 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3345 skip_call |=
3346 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3347 UNRECOGNIZED_VALUE, LayerName,
3348 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3349 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3350 i, i);
3351 }
3352 }
3353 }
3354 }
3355
3356 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003357 result =
3358 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003359
Dustin Gravesc900f572016-05-16 11:07:59 -06003360 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003361 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003362
3363 return result;
3364}
3365
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003366VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3367 const VkAllocationCallbacks *pAllocator) {
3368 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003369 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003370 assert(my_data != NULL);
3371
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003372 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003373
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003374 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003375 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003376 }
3377}
3378
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003379VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3380 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003381 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003382 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003383 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003384 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003385
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003386 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003387
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003388 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3389
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003390 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003391 result =
3392 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003393
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003394 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003395 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003396
3397 return result;
3398}
3399
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003400VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3401 const VkAllocationCallbacks *pAllocator) {
3402 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003403 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003404 assert(my_data != NULL);
3405
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003406 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003407
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003408 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003409 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003410 }
3411}
3412
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003413VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3414 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003415 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003416 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003417 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3418 assert(my_data != NULL);
3419
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003420 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003422 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003423 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3424
3425 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3426 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003427
3428 return result;
3429}
3430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003431VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3432 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003433 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003434 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003435 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003436 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003437
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003438 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003439
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003440 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003441 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3442
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003443 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003444 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003445
3446 return result;
3447}
3448
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003449VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003450 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003451 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003452 bool skip_call = false;
3453 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3454 assert(device_data != nullptr);
3455 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003456
Dustin Gravesc900f572016-05-16 11:07:59 -06003457 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003458
Dustin Gravesc900f572016-05-16 11:07:59 -06003459 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3460 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3461 // validate_array()
3462 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3463 pDescriptorSets, true, true);
3464
3465 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003466 result = get_dispatch_table(pc_device_table_map, device)
3467 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003468
Dustin Gravesc900f572016-05-16 11:07:59 -06003469 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003470 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003471
3472 return result;
3473}
3474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003475VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3476 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3477 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003478 bool skip_call = false;
3479 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3480 assert(device_data != NULL);
3481 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003482
Dustin Gravesc900f572016-05-16 11:07:59 -06003483 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3484 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003485
Dustin Gravesc900f572016-05-16 11:07:59 -06003486 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3487 if (pDescriptorWrites != NULL) {
3488 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3489 // descriptorCount must be greater than 0
3490 if (pDescriptorWrites[i].descriptorCount == 0) {
3491 skip_call |=
3492 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3493 REQUIRED_PARAMETER, LayerName,
3494 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3495 }
3496
3497 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3498 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3499 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3500 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3501 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3502 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3503 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3504 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3505 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3506 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3507 __LINE__, REQUIRED_PARAMETER, LayerName,
3508 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3509 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3510 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3511 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3512 i, i);
3513 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3514 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3515 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3516 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3517 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3518 ++descriptor_index) {
3519 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3520 "pDescriptorWrites[i].pImageInfo[i].imageView",
3521 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3522 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3523 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3524 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3525 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3526 }
3527 }
3528 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3529 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3530 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3531 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3532 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3533 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3534 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3535 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3536 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3537 __LINE__, REQUIRED_PARAMETER, LayerName,
3538 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3539 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3540 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3541 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3542 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003543 } else {
3544 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3545 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3546 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3547 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3548 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003549 }
3550 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3551 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3552 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3553 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3554 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3555 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3556 __LINE__, REQUIRED_PARAMETER, LayerName,
3557 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3558 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3559 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3560 i, i);
3561 } else {
3562 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3563 ++descriptor_index) {
3564 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3565 "pDescriptorWrites[i].pTexelBufferView[i]",
3566 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3567 }
3568 }
3569 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003570
3571 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3572 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3573 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3574 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3575 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3576 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3577 skip_call |=
3578 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003579 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003580 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3581 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3582 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3583 }
3584 }
3585 }
3586 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3587 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3588 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3589 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3590 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3591 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3592 skip_call |=
3593 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003594 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003595 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3596 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3597 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3598 }
3599 }
3600 }
3601 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003602 }
3603 }
3604
3605 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003606 get_dispatch_table(pc_device_table_map, device)
3607 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003608 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003609}
3610
Chia-I Wu01ca2372016-05-13 14:37:49 +08003611VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003612 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003613 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003614 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003615 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003616 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003617
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003618 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003619
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003620 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003621 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3622
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003623 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003624 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003625
3626 return result;
3627}
3628
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003629VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3630 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003631 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003632 assert(my_data != NULL);
3633
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003634 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003635
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003636 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003637 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003638 }
3639}
3640
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003641bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3642 bool skip_call = false;
3643 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3644
3645 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3646 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3647 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 -06003648 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003649 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3650 }
3651 }
3652 return skip_call;
3653}
3654
Chia-I Wu01ca2372016-05-13 14:37:49 +08003655VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003656 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003657 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003658 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003659 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003660 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003661
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003662 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3663 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003664
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003665 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003666 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3667
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003668 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003669 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003670
3671 return result;
3672}
3673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003674VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3675 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003676 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003677 assert(my_data != NULL);
3678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003679 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003681 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003682 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003683 }
3684}
3685
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003686VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3687 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003689 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003690
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003691 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003692
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003693 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003694 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003695 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003696}
3697
Chia-I Wu01ca2372016-05-13 14:37:49 +08003698VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003699 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003700 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003701 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003702 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003703 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003704
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003705 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003706 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003707
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003708 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003710 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003711 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3712
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003713 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003714 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003715
3716 return result;
3717}
3718
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003719VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3720 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003721 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003722 assert(my_data != NULL);
3723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003724 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003726 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003727 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003728 }
3729}
3730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003731VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003732 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003733 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003734 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3735 assert(my_data != NULL);
3736
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003737 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003738
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003739 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003740 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3741
3742 validate_result(my_data->report_data, "vkResetCommandPool", result);
3743 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003744
3745 return result;
3746}
3747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003748VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3749 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003750 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003751 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003752 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003753 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003754
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003755 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003756
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003757 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003758 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3759
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003760 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003761 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003762
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003763 return result;
3764}
3765
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003766VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003767 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003768 bool skip_call = false;
3769 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3770 assert(device_data != nullptr);
3771 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003772
Dustin Gravesc900f572016-05-16 11:07:59 -06003773 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003774
Dustin Gravesc900f572016-05-16 11:07:59 -06003775 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3776 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3777 // validate_array()
3778 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3779 pCommandBuffers, true, true);
3780
3781 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003782 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003783 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003784 }
3785}
3786
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003787bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3788 bool skip_call = false;
3789 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3790 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3791
3792 if (pInfo != NULL) {
3793 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3794 skip_call |=
3795 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 -06003796 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003797 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3798 "inheritedQueries.");
3799 }
3800
3801 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3802 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3803 skip_call |=
3804 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 -06003805 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003806 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3807 "valid combination of VkQueryControlFlagBits.",
3808 pInfo->queryFlags);
3809 }
3810 }
3811 return skip_call;
3812}
3813
3814VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003815 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003816 bool skip_call = false;
3817 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3818 assert(device_data != nullptr);
3819 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003820
Dustin Gravesc900f572016-05-16 11:07:59 -06003821 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003822
Dustin Gravesc900f572016-05-16 11:07:59 -06003823 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3824 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3825 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3826 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3827 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3828
3829 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003830 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003831 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003832
3833 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3834 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3835
Dustin Gravesc900f572016-05-16 11:07:59 -06003836 // TODO: This only needs to be validated when the inherited queries feature is enabled
3837 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3838 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3839
3840 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3841 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3842 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3843 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3844 }
3845
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003846 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3847
Dustin Gravesc900f572016-05-16 11:07:59 -06003848 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003849 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3850
Dustin Gravesc900f572016-05-16 11:07:59 -06003851 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003852 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003853
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003854 return result;
3855}
3856
Chia-I Wu01ca2372016-05-13 14:37:49 +08003857VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003858 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3859 assert(my_data != NULL);
3860
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003861 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003862
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003863 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003864
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003865 return result;
3866}
3867
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003868VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003870 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3871 assert(my_data != NULL);
3872
Dustin Graves16d18972016-05-09 17:36:57 -06003873 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003874
Dustin Graves16d18972016-05-09 17:36:57 -06003875 if (!skip_call) {
3876 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3877
3878 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3879 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003880
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003881 return result;
3882}
3883
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003884VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3885 VkPipeline pipeline) {
3886 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003887 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3888 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003889
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003890 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003892 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003893 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3894 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003895}
3896
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003897VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3898 const VkViewport *pViewports) {
3899 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003900 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003901 assert(my_data != NULL);
3902
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003903 skip_call |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003904
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003905 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003906 get_dispatch_table(pc_device_table_map, commandBuffer)
3907 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003908 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003909}
3910
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003911VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3912 const VkRect2D *pScissors) {
3913 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003914 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003915 assert(my_data != NULL);
3916
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003917 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003918
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003919 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003920 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3921 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003922}
3923
Chia-I Wu01ca2372016-05-13 14:37:49 +08003924VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003925 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003926}
3927
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003928VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
3929 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930 get_dispatch_table(pc_device_table_map, commandBuffer)
3931 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003932}
3933
Chia-I Wu01ca2372016-05-13 14:37:49 +08003934VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003935 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003936 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003937 assert(my_data != NULL);
3938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003939 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003940
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003941 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003942 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3943 }
Cody Northrop12365112015-08-17 11:10:49 -06003944}
3945
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003946VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003947 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003948}
3949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003950VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
3951 uint32_t compareMask) {
3952 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003953 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3954 assert(my_data != NULL);
3955
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003956 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06003957
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003958 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003959 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3960 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003961}
3962
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003963VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
3964 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003965 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3966 assert(my_data != NULL);
3967
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003968 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06003969
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003970 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003971 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3972 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003973}
3974
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003975VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
3976 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06003977 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3978 assert(my_data != NULL);
3979
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003980 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06003981
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003982 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06003983 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3984 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003985}
3986
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003987VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3988 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
3989 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
3990 const uint32_t *pDynamicOffsets) {
3991 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003992 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003993 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003995 skip_call |=
3996 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
3997 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003998
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003999 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004000 get_dispatch_table(pc_device_table_map, commandBuffer)
4001 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4002 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004003 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004004}
4005
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004006VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4007 VkIndexType indexType) {
4008 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004009 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4010 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004011
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004012 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004014 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004015 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4016 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004017}
4018
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004019VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4020 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4021 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004022 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004023 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004024
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004025 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004026
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004027 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 get_dispatch_table(pc_device_table_map, commandBuffer)
4029 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004030 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004031}
4032
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004033bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4034 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004035 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004036 // 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 -07004037 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004038 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 -06004039 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004040 return false;
4041 }
4042
4043 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004044 // 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 -07004045 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004046 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 -06004047 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004048 return false;
4049 }
4050
4051 return true;
4052}
4053
Chia-I Wu01ca2372016-05-13 14:37:49 +08004054VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4055 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004056 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004057
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004058 get_dispatch_table(pc_device_table_map, commandBuffer)
4059 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004060}
4061
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004062VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4063 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004064 get_dispatch_table(pc_device_table_map, commandBuffer)
4065 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004066}
4067
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004068VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4069 uint32_t stride) {
4070 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004071 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4072 assert(my_data != NULL);
4073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004074 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004075
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004076 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004077 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4078 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004079}
4080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004081VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4082 uint32_t count, uint32_t stride) {
4083 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004084 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4085 assert(my_data != NULL);
4086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004087 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004089 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004090 get_dispatch_table(pc_device_table_map, commandBuffer)
4091 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4092 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004093}
4094
Chia-I Wu01ca2372016-05-13 14:37:49 +08004095VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004096 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004097}
4098
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004099VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4100 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4102 assert(my_data != NULL);
4103
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004104 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004105
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004106 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004107 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4108 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004109}
4110
Chia-I Wu01ca2372016-05-13 14:37:49 +08004111VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4112 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004113 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004114 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004115 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004116
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004117 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004118
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004119 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004120 get_dispatch_table(pc_device_table_map, commandBuffer)
4121 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004122 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004123}
4124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004125bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4126 if (pRegions != nullptr) {
4127 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4128 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004129 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 -06004130 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004131 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4132 return false;
4133 }
4134 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4135 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004136 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 -06004137 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004138 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4139 return false;
4140 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004141 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004142
4143 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004144}
4145
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004146VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4147 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4148 const VkImageCopy *pRegions) {
4149 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004150 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004151 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004153 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4154 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004155
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004156 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004157 PreCmdCopyImage(commandBuffer, pRegions);
4158
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004159 get_dispatch_table(pc_device_table_map, commandBuffer)
4160 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004161 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004162}
4163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004164bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4165 if (pRegions != nullptr) {
4166 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4167 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004168 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 -06004169 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004170 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4171 return false;
4172 }
4173 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4174 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004175 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 -06004176 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004177 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4178 return false;
4179 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004180 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004181
4182 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004183}
4184
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004185VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4186 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4187 const VkImageBlit *pRegions, VkFilter filter) {
4188 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004189 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004190 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004191
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004192 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4193 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004194
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004195 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004196 PreCmdBlitImage(commandBuffer, pRegions);
4197
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004198 get_dispatch_table(pc_device_table_map, commandBuffer)
4199 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004200 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004201}
4202
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004203bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4204 if (pRegions != nullptr) {
4205 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4206 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004207 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 -06004208 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004209 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4210 "enumerator");
4211 return false;
4212 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004213 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004214
4215 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004216}
4217
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004218VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4219 VkImageLayout dstImageLayout, uint32_t regionCount,
4220 const VkBufferImageCopy *pRegions) {
4221 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004222 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004223 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004224
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004225 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4226 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004227
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004228 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004229 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4230
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004231 get_dispatch_table(pc_device_table_map, commandBuffer)
4232 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004233 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004234}
4235
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004236bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4237 if (pRegions != nullptr) {
4238 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4239 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004240 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 -06004241 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004242 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4243 "enumerator");
4244 return false;
4245 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004246 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004247
4248 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004249}
4250
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004251VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4252 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4253 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004254 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004255 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004256
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004257 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4258 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004259
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004260 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004261 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4262
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004263 get_dispatch_table(pc_device_table_map, commandBuffer)
4264 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004265 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004266}
4267
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004268VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4269 VkDeviceSize dataSize, const uint32_t *pData) {
4270 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004271 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004272 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004273
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004274 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004275
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004276 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004277 skip_call |= log_msg(
4278 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4279 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004280 }
4281
4282 if ((dataSize <= 0) || (dataSize > 65536)) {
4283 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 -06004284 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4285 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004286 dataSize);
4287 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004288 skip_call |= log_msg(
4289 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4290 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004291 }
4292
4293 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 get_dispatch_table(pc_device_table_map, commandBuffer)
4295 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004296 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004297}
4298
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004299VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4300 VkDeviceSize size, uint32_t data) {
4301 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004302 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4303 assert(my_data != NULL);
4304
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004305 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004306
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004307 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004308 skip_call |= log_msg(
4309 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4310 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004311 }
4312
4313 if (size != VK_WHOLE_SIZE) {
4314 if (size <= 0) {
4315 skip_call |= log_msg(
4316 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004317 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004318 } else if (size & 3) {
4319 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 -06004320 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004321 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4322 }
4323 }
4324
4325 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004326 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4327 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328}
4329
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004330VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4331 const VkClearColorValue *pColor, uint32_t rangeCount,
4332 const VkImageSubresourceRange *pRanges) {
4333 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004334 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004335 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004336
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004337 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004338
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004339 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004340 get_dispatch_table(pc_device_table_map, commandBuffer)
4341 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004342 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004343}
4344
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004345VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4346 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4347 const VkImageSubresourceRange *pRanges) {
4348 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004349 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004350 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004351
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004352 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4353 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004354
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004355 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004356 get_dispatch_table(pc_device_table_map, commandBuffer)
4357 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004358 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004359}
4360
Chia-I Wu01ca2372016-05-13 14:37:49 +08004361VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4362 const VkClearAttachment *pAttachments, uint32_t rectCount,
4363 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004364 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004366 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004367
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004368 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004369
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004370 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004371 get_dispatch_table(pc_device_table_map, commandBuffer)
4372 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004373 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004374}
4375
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004376bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4377 if (pRegions != nullptr) {
4378 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4379 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4380 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004381 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004382 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004383 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4384 return false;
4385 }
4386 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4387 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4388 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004389 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004390 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004391 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4392 return false;
4393 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004394 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004395
4396 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004397}
4398
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004399VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4400 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4401 const VkImageResolve *pRegions) {
4402 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004403 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004404 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004405
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004406 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4407 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004409 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004410 PreCmdResolveImage(commandBuffer, pRegions);
4411
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004412 get_dispatch_table(pc_device_table_map, commandBuffer)
4413 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004414 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004415}
4416
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004417VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4418 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004419 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4420 assert(my_data != NULL);
4421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004422 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004423
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004424 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004425 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4426 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004427}
4428
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004429VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4430 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004431 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4432 assert(my_data != NULL);
4433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004434 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004435
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004436 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004437 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4438 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004439}
4440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004441VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4442 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4443 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4444 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4445 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4446 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004447 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004448 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004449
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004450 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4451 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4452 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004453
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004454 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004455 get_dispatch_table(pc_device_table_map, commandBuffer)
4456 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4457 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004458 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004459}
4460
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004461VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4462 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4463 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4464 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4465 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4466 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004468 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004470 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4471 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4472 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004473
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004474 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004475 get_dispatch_table(pc_device_table_map, commandBuffer)
4476 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4477 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004478 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004479}
4480
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004481VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4482 VkQueryControlFlags flags) {
4483 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004484 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4485 assert(my_data != NULL);
4486
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004487 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004489 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004490 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4491 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004492}
4493
Chia-I Wu01ca2372016-05-13 14:37:49 +08004494VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004495 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004496 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4497 assert(my_data != NULL);
4498
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004499 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004502 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4503 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004504}
4505
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004506VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4507 uint32_t queryCount) {
4508 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004509 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4510 assert(my_data != NULL);
4511
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004512 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004513
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004514 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004515 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4516 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004517}
4518
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004519bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4520 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004521
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004522 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004523
4524 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004525}
4526
Chia-I Wu01ca2372016-05-13 14:37:49 +08004527VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4528 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004529 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004530 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4531 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004532
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004533 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004534
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004535 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004536 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4537
4538 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4539 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004540}
4541
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004542VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4543 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4544 VkDeviceSize stride, VkQueryResultFlags flags) {
4545 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004546 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4547 assert(my_data != NULL);
4548
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004549 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4550 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004552 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004553 get_dispatch_table(pc_device_table_map, commandBuffer)
4554 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4555 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004556}
4557
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004558VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4559 uint32_t offset, uint32_t size, const void *pValues) {
4560 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004561 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004562 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004563
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004564 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004566 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004567 get_dispatch_table(pc_device_table_map, commandBuffer)
4568 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004569 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004570}
4571
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004572VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4573 VkSubpassContents contents) {
4574 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004575 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004576 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004577
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004578 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004579
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004580 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004581 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004582 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004583}
4584
Chia-I Wu01ca2372016-05-13 14:37:49 +08004585VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004586 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004587 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4588 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004590 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004591
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004592 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004593 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4594 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004595}
4596
Chia-I Wu01ca2372016-05-13 14:37:49 +08004597VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004598 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004599}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004600
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004601VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4602 const VkCommandBuffer *pCommandBuffers) {
4603 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004604 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004605 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004606
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004607 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004609 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004610 get_dispatch_table(pc_device_table_map, commandBuffer)
4611 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004612 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004613}
4614
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004615VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004616 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4617}
4618
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004619VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4620 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004621 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4622}
4623
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004624VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4625 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004626 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4627 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4628
4629 return VK_ERROR_LAYER_NOT_PRESENT;
4630}
4631
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004632VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4633 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004634 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004635 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004636 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004637
4638 assert(physicalDevice);
4639
4640 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4641 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004642}
4643
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004644// WSI Extension Functions
4645
4646VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004647 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004648 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004649 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004650 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4651 assert(my_data != NULL);
4652
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004653 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004654
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004655 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004656 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4657
4658 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4659 }
4660
4661 return result;
4662}
4663
4664VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004665 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004666 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004667 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004668 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4669 assert(my_data != NULL);
4670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004671 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004672 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004674 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004675 result = get_dispatch_table(pc_device_table_map, device)
4676 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4677
4678 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4679 }
4680
4681 return result;
4682}
4683
4684VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004685 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004686 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004687 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4689 assert(my_data != NULL);
4690
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004691 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004692 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004694 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004695 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004696 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004697
4698 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4699 }
4700
4701 return result;
4702}
4703
4704VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4705 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004706 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004707 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4708 assert(my_data != NULL);
4709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004710 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004711
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004712 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004713 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4714
4715 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4716 }
4717
4718 return result;
4719}
4720
4721VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4722 VkSurfaceKHR surface, VkBool32 *pSupported) {
4723 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004724 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004725 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4726 assert(my_data != NULL);
4727
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004728 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004729 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004731 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004732 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4733 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4734
4735 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4736 }
4737
4738 return result;
4739}
4740
4741VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4742 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4743 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004744 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004745 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4746 assert(my_data != NULL);
4747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004748 skip_call |=
4749 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004751 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004752 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4753 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4754
4755 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4756 }
4757
4758 return result;
4759}
4760
4761VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4762 uint32_t *pSurfaceFormatCount,
4763 VkSurfaceFormatKHR *pSurfaceFormats) {
4764 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004765 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004766 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4767 assert(my_data != NULL);
4768
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004769 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4770 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004771
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004772 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004773 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4774 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4775
4776 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4777 }
4778
4779 return result;
4780}
4781
4782VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4783 uint32_t *pPresentModeCount,
4784 VkPresentModeKHR *pPresentModes) {
4785 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004786 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004787 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4788 assert(my_data != NULL);
4789
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004790 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4791 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004792
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004793 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004794 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4795 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4796
4797 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4798 }
4799
4800 return result;
4801}
4802
4803#ifdef VK_USE_PLATFORM_WIN32_KHR
4804VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4805 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4806 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4807
4808 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4809 assert(my_data != NULL);
4810
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004811 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004812
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004813 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004814 result =
4815 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4816 }
4817
4818 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4819
4820 return result;
4821}
4822#endif // VK_USE_PLATFORM_WIN32_KHR
4823
4824#ifdef VK_USE_PLATFORM_XCB_KHR
4825VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4826 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4827 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4828
4829 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4830 assert(my_data != NULL);
4831
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004832 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004833
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004834 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004835 result =
4836 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4837 }
4838
4839 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4840
4841 return result;
4842}
4843
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004844VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4845 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4846 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004847 VkBool32 result = false;
4848
4849 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4850 assert(my_data != NULL);
4851
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004852 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4853 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004855 if (!skip_call) {
4856 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4857 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004858 }
4859
4860 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004861}
4862#endif // VK_USE_PLATFORM_XCB_KHR
4863
4864#ifdef VK_USE_PLATFORM_XLIB_KHR
4865VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004866 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004867 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4868
4869 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4870 assert(my_data != NULL);
4871
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004872 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004874 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004875 result =
4876 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4877 }
4878
4879 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4880
4881 return result;
4882}
4883
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004884VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4885 uint32_t queueFamilyIndex, Display *dpy,
4886 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004887 VkBool32 result = false;
4888
4889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4890 assert(my_data != NULL);
4891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004892 bool skip_call =
4893 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004894
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004895 if (!skip_call) {
4896 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4897 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004898 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004899}
4900#endif // VK_USE_PLATFORM_XLIB_KHR
4901
4902#ifdef VK_USE_PLATFORM_MIR_KHR
4903VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004904 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004905 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4906
4907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4908 assert(my_data != NULL);
4909
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004910 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004911
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004912 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004913 result =
4914 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4915 }
4916
4917 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4918
4919 return result;
4920}
4921
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004922VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4923 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004924 VkBool32 result = false;
4925
4926 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4927 assert(my_data != NULL);
4928
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004929 bool skip_call =
4930 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004931
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004932 if (!skip_call) {
4933 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4934 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004935 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004936}
4937#endif // VK_USE_PLATFORM_MIR_KHR
4938
4939#ifdef VK_USE_PLATFORM_WAYLAND_KHR
4940VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004941 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4943
4944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4945 assert(my_data != NULL);
4946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004947 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004948
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004949 if (!skip_call) {
4950 result = get_dispatch_table(pc_instance_table_map, instance)
4951 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004952 }
4953
4954 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
4955
4956 return result;
4957}
4958
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004959VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4960 uint32_t queueFamilyIndex,
4961 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004962 VkBool32 result = false;
4963
4964 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4965 assert(my_data != NULL);
4966
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004967 bool skip_call =
4968 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004969
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004970 if (!skip_call) {
4971 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4972 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973 }
4974}
4975#endif // VK_USE_PLATFORM_WAYLAND_KHR
4976
4977#ifdef VK_USE_PLATFORM_ANDROID_KHR
4978VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004979 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004980 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4981
4982 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4983 assert(my_data != NULL);
4984
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004985 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004986
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004987 if (!skip_call) {
4988 result = get_dispatch_table(pc_instance_table_map, instance)
4989 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004990 }
4991
4992 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
4993
4994 return result;
4995}
4996#endif // VK_USE_PLATFORM_ANDROID_KHR
4997
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004998static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004999
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005000static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005001
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005002static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005003
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005004static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005005
Chia-I Wu01ca2372016-05-13 14:37:49 +08005006VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005007 assert(device);
5008
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005009 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5010
Dustin Graves080069b2016-04-05 13:48:15 -06005011 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005012 return NULL;
5013 }
5014
Chia-I Wuf9b01382016-05-16 07:37:41 +08005015 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5016 if (proc)
5017 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005018
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005019 proc = InterceptWsiEnabledCommand(funcName, device);
5020 if (proc)
5021 return proc;
5022
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005023 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005024 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005025 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005026}
5027
Chia-I Wu01ca2372016-05-13 14:37:49 +08005028VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005029 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005030 if (!proc)
5031 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005032
5033 if (!proc)
5034 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005035
Chia-I Wu617f2a42016-05-16 07:41:17 +08005036 if (proc)
5037 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005038
Chia-I Wu617f2a42016-05-16 07:41:17 +08005039 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005040
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005041 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005042
Chia-I Wu617f2a42016-05-16 07:41:17 +08005043 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005044 if (!proc)
5045 proc = InterceptWsiEnabledCommand(funcName, instance);
5046
Chia-I Wu617f2a42016-05-16 07:41:17 +08005047 if (proc)
5048 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005049
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005050 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005051 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005052 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005053}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005055static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005056 static const struct {
5057 const char *name;
5058 PFN_vkVoidFunction proc;
5059 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005060 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5061 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5062 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5063 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5064 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5065 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5066 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5067 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5068 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5069 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5070 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5071 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5072 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5073 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5074 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5075 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5076 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Chia-I Wu617f2a42016-05-16 07:41:17 +08005077 };
5078
5079 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5080 if (!strcmp(core_instance_commands[i].name, name))
5081 return core_instance_commands[i].proc;
5082 }
5083
5084 return nullptr;
5085}
5086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005087static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005088 static const struct {
5089 const char *name;
5090 PFN_vkVoidFunction proc;
5091 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005092 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5093 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5094 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5095 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5096 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5097 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5098 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5099 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5100 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5101 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5102 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5103 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5104 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5105 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5106 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5107 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5108 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5109 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5110 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5111 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5112 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5113 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5114 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5115 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5116 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5117 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5118 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5119 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5120 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5121 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5122 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5123 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5124 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5125 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5126 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5127 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5128 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5129 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5130 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5131 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5132 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5133 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5134 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5135 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5136 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5137 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5138 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5139 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5140 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5141 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5142 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5143 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5144 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5145 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5146 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5147 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5148 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5149 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5150 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5151 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5152 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5153 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5154 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5155 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5156 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5157 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5158 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5159 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5160 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5161 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5162 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5163 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5164 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5165 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5166 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5167 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5168 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5169 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5170 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5171 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5172 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5173 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5174 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5175 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5176 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5177 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5178 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5179 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5180 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5181 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5182 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5183 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5184 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5185 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5186 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5187 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5188 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5189 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5190 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5191 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5192 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5193 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5194 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5195 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5196 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5197 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5198 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5199 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5200 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5201 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5202 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5203 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5204 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5205 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5206 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5207 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5208 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Chia-I Wuf9b01382016-05-16 07:37:41 +08005209 };
5210
5211 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5212 if (!strcmp(core_device_commands[i].name, name))
5213 return core_device_commands[i].proc;
5214 }
5215
5216 return nullptr;
5217}
5218
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005219static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005220 static const struct {
5221 const char *name;
5222 PFN_vkVoidFunction proc;
5223 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005224 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5225 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5226 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5227 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005228 };
5229
5230 if (device) {
5231 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5232 if (!device_data->wsi_enabled)
5233 return nullptr;
5234 }
5235
5236 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5237 if (!strcmp(wsi_device_commands[i].name, name))
5238 return wsi_device_commands[i].proc;
5239 }
5240
5241 return nullptr;
5242}
5243
5244static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5245 static const struct {
5246 const char *name;
5247 PFN_vkVoidFunction proc;
5248 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005249 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5250 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5251 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5252 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5253 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5254 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005255 };
5256
5257 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005258 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005259 return nullptr;
5260
5261 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5262 if (!strcmp(wsi_instance_commands[i].name, name))
5263 return wsi_instance_commands[i].proc;
5264 }
5265
5266#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005267 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005268 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5269#endif // VK_USE_PLATFORM_WIN32_KHR
5270#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005271 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005272 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005273 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005274 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5275#endif // VK_USE_PLATFORM_XCB_KHR
5276#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005277 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005278 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005279 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005280 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5281#endif // VK_USE_PLATFORM_XLIB_KHR
5282#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005283 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005284 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005285 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005286 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5287#endif // VK_USE_PLATFORM_MIR_KHR
5288#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005289 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005290 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005291 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5292 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005293 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5294#endif // VK_USE_PLATFORM_WAYLAND_KHR
5295#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005296 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005297 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5298#endif // VK_USE_PLATFORM_ANDROID_KHR
5299
5300 return nullptr;
5301}
5302
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005303} // namespace parameter_validation
5304
5305// vk_layer_logging.h expects these to be defined
5306
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005307VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5308 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5309 const VkAllocationCallbacks *pAllocator,
5310 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005311 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005312}
5313
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005314VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5315 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005316 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005317}
5318
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005319VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5320 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5321 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005322 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005323}
5324
5325// loader-layer interface v0
5326
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005327VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5328 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005329 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005330}
5331
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005332VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5333 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005334 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005335}
5336
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005337VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5338 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005339 // the layer command handles VK_NULL_HANDLE just fine internally
5340 assert(physicalDevice == VK_NULL_HANDLE);
5341 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005342}
5343
5344VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5345 const char *pLayerName, uint32_t *pCount,
5346 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005347 // the layer command handles VK_NULL_HANDLE just fine internally
5348 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005349 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005350}
5351
5352VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005353 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005354}
5355
5356VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005357 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005358}