blob: b3bf5d052c7a9b0d512361f7eec6fcd22b20c913 [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;
Michael Lentinebdf744f2016-01-27 15:43:43 -060071
Mark Lobodzinskia4932512016-06-27 15:13:00 -060072 layer_data()
73 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{} {};
Cody Northrop55443ef2015-09-28 15:09:32 -060074};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050075
Jon Ashburn5484e0c2016-03-08 17:48:44 -070076static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060077static device_table_map pc_device_table_map;
78static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060079
Jeremy Hayes99a96322015-06-26 12:48:09 -060080// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070081debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060082 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060083 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060084#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060085 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 -060086#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060087 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060088
89 return data->report_data;
90}
91
92// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070093debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060094 dispatch_key key = get_dispatch_key(object);
95 layer_data *data = get_my_data_ptr(key, layer_data_map);
96#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060097 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 -060098#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060099 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600100 return data->report_data;
101}
102
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600103static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600104
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600105 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600106}
107
Chia-I Wu01ca2372016-05-13 14:37:49 +0800108VKAPI_ATTR VkResult VKAPI_CALL
109CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
110 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700111 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700112 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600113
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700114 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700115 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600116 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600117 }
118
119 return result;
120}
121
Chia-I Wu01ca2372016-05-13 14:37:49 +0800122VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance,
123 VkDebugReportCallbackEXT msgCallback,
124 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700125 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700126 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600127
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700128 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700129 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600130}
131
Chia-I Wu01ca2372016-05-13 14:37:49 +0800132VKAPI_ATTR void VKAPI_CALL
133DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
134 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700135 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
136 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700137}
138
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700139static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600140
Chia-I Wu3384db82016-05-16 07:30:58 +0800141static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600142 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800143};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700144
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700145static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600146 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700147 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
148 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
149 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
150 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
151 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 -0700152 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600154 return false;
155 }
156
157 return true;
158}
159
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
161 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 return "unrecognized enumerator";
163 }
164
165 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600167 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600185 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
192 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
195 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800197 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600198 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800200 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600201 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700202 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700203 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
204 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600205
206 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700207 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600208 enumeratorString += string;
209
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700210 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600211 enumeratorString += '|';
212 }
213 }
214
215 return enumeratorString;
216}
217
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
219 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
220 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
221 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
222 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
223 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600224 return false;
225 }
226
227 return true;
228}
229
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700230static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
231 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 return "unrecognized enumerator";
233 }
234
235 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700236 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600237 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
238 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600240 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700242 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
244 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
247 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
250 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800252 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600253 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600255 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
256 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700257 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800258 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600259 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600260
261 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263 enumeratorString += string;
264
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700265 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266 enumeratorString += '|';
267 }
268 }
269
270 return enumeratorString;
271}
272
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700273static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
274 VkQueueFlagBits allFlags =
275 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
276 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600277 return false;
278 }
279
280 return true;
281}
282
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700283static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
284 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600285 return "unrecognized enumerator";
286 }
287
288 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800290 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600291 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600293 strings.push_back("VK_QUEUE_COMPUTE_BIT");
294 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800296 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600297 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700298 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600299 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
300 }
301
302 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700303 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600304 enumeratorString += string;
305
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700306 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600307 enumeratorString += '|';
308 }
309 }
310
311 return enumeratorString;
312}
313
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
315 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
316 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
317 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
318 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600319 return false;
320 }
321
322 return true;
323}
324
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700325static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
326 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600327 return "unrecognized enumerator";
328 }
329
330 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600332 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
333 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800335 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600336 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600338 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
339 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800341 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600342 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700343 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800344 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 }
346
347 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700348 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600349 enumeratorString += string;
350
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700351 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600352 enumeratorString += '|';
353 }
354 }
355
356 return enumeratorString;
357}
358
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700359static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700360 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700361 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600362 return false;
363 }
364
365 return true;
366}
367
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
369 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600370 return "unrecognized enumerator";
371 }
372
373 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700374 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800375 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600376 }
377
378 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700379 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600380 enumeratorString += string;
381
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700382 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600383 enumeratorString += '|';
384 }
385 }
386
387 return enumeratorString;
388}
389
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700390static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
391 VkSparseImageFormatFlagBits allFlags =
392 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
393 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
394 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600395 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600396 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600397
398 return true;
399}
400
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700401static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
402 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600403 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600404 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405
406 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800408 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600409 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700410 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800411 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700413 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800414 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600415 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600416
417 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700418 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600419 enumeratorString += string;
420
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422 enumeratorString += '|';
423 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600424 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600425
426 return enumeratorString;
427}
428
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700429static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700430 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700431 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600432 return false;
433 }
434
435 return true;
436}
437
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
439 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600440 return "unrecognized enumerator";
441 }
442
443 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700444 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600445 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
446 }
447
448 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700449 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600450 enumeratorString += string;
451
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700452 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600453 enumeratorString += '|';
454 }
455 }
456
457 return enumeratorString;
458}
459
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700460static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
461 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
462 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
463 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
464 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
465 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600466 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
467 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
468 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700469 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600470 return false;
471 }
472
473 return true;
474}
475
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700476static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
477 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 return "unrecognized enumerator";
479 }
480
481 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700483 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600484 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700485 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700486 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_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_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700504 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600505 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700507 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600508 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700510 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600511 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700512 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700513 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 }
515
516 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700517 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 enumeratorString += string;
519
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700520 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600521 enumeratorString += '|';
522 }
523 }
524
525 return enumeratorString;
526}
527
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700528static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
529 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
530 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
531 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600532 return false;
533 }
534
535 return true;
536}
537
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700538static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
539 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 return "unrecognized enumerator";
541 }
542
543 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600545 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
546 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700547 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600548 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
549 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600551 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
552 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700553 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600554 strings.push_back("VK_QUERY_RESULT_64_BIT");
555 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600556
557 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700558 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600559 enumeratorString += string;
560
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700561 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600562 enumeratorString += '|';
563 }
564 }
565
566 return enumeratorString;
567}
568
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
570 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
571 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
572 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
573 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
574 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600575 return false;
576 }
577
578 return true;
579}
580
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700581static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
582 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 return "unrecognized enumerator";
584 }
585
586 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600588 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
589 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600591 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
592 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
601 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800603 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600604 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
607 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700608 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800609 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600610 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700611 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600612 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
613 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614
615 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700616 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617 enumeratorString += string;
618
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700619 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620 enumeratorString += '|';
621 }
622 }
623
624 return enumeratorString;
625}
626
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700627static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
628 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
629 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
630 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600631 return false;
632 }
633
634 return true;
635}
636
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700637static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
638 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639 return "unrecognized enumerator";
640 }
641
642 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600644 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
645 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700646 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600647 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
648 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700649 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600650 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600651 }
652
653 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700654 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600655 enumeratorString += string;
656
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700657 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600658 enumeratorString += '|';
659 }
660 }
661
662 return enumeratorString;
663}
664
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700665static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
666 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
667 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
668 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
669 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600670 return false;
671 }
672
673 return true;
674}
675
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700676static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
677 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 return "unrecognized enumerator";
679 }
680
681 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600683 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
684 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600686 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
687 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600689 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
690 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700691 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600692 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
693 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700694 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600695 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600696 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600697
698 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700699 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 enumeratorString += string;
701
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700702 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 enumeratorString += '|';
704 }
705 }
706
707 return enumeratorString;
708}
709
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700710static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
711 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
712 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
713 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600714 return false;
715 }
716
717 return true;
718}
719
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700720static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
721 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600722 return "unrecognized enumerator";
723 }
724
725 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800727 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600728 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700729 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800730 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600731 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700732 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800733 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600734 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700735 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800736 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600737 }
738
739 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700740 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600741 enumeratorString += string;
742
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700743 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600744 enumeratorString += '|';
745 }
746 }
747
748 return enumeratorString;
749}
750
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700751static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
752 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
753 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
754 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600755 return false;
756 }
757
758 return true;
759}
760
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700761static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
762 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600763 return "unrecognized enumerator";
764 }
765
766 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700767 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600768 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
769 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700770 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600771 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
772 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700773 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600774 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600775 }
776
777 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700778 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600779 enumeratorString += string;
780
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700781 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600782 enumeratorString += '|';
783 }
784 }
785
786 return enumeratorString;
787}
788
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
790 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
791 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
792 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
793 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600794 return false;
795 }
796
797 return true;
798}
799
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700800static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
801 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600802 return "unrecognized enumerator";
803 }
804
805 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600807 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600808 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700809 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600810 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600811 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
814 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600816 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
817 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600819 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600820 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600822 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600823 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700824 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600825 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600826 }
827
828 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600830 enumeratorString += string;
831
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700832 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600833 enumeratorString += '|';
834 }
835 }
836
837 return enumeratorString;
838}
839
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700840static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800841 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700842 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
843 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
844 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
845 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
846 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
847 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 -0700848 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700849 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600850 return false;
851 }
852
853 return true;
854}
855
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700856static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
857 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600858 return "unrecognized enumerator";
859 }
860
861 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800863 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
864 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800866 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600867 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600869 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600875 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700878 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600881 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600884 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600887 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600896 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700899 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600900 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600902 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
903 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600905 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
906 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700907 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600908 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
909 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700910 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600911 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600912 }
913
914 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700915 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600916 enumeratorString += string;
917
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700918 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600919 enumeratorString += '|';
920 }
921 }
922
923 return enumeratorString;
924}
925
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700926static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800927 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700928 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
929 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
930 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
931 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
932 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 +0800933
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700934 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600935 return false;
936 }
937
938 return true;
939}
940
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700941static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
942 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600943 return "unrecognized enumerator";
944 }
945
946 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700947 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800948 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600949 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800951 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600952 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600985 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800987 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600988 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800990 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600991 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700992 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800993 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600994 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700995 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800996 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600997 }
998
999 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001000 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001001 enumeratorString += string;
1002
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001003 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001004 enumeratorString += '|';
1005 }
1006 }
1007
1008 return enumeratorString;
1009}
1010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001011static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1012 VkCommandPoolCreateFlagBits allFlags =
1013 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1014 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001015 return false;
1016 }
1017
1018 return true;
1019}
1020
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001021static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1022 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001023 return "unrecognized enumerator";
1024 }
1025
1026 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001027 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001028 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001029 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001030 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001031 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001032 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001033
1034 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001035 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001036 enumeratorString += string;
1037
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001038 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039 enumeratorString += '|';
1040 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001041 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001042
1043 return enumeratorString;
1044}
1045
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001046static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001047 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001048 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001049 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001050 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001051
1052 return true;
1053}
1054
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1056 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001057 return "unrecognized enumerator";
1058 }
1059
1060 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001061 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001062 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001063 }
1064
1065 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001066 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001067 enumeratorString += string;
1068
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001069 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 enumeratorString += '|';
1071 }
1072 }
1073
1074 return enumeratorString;
1075}
1076
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001077static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1078 VkCommandBufferUsageFlags allFlags =
1079 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1080 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1081 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001082 return false;
1083 }
1084
1085 return true;
1086}
1087
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001088static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1089 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001090 return "unrecognized enumerator";
1091 }
1092
1093 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001095 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001096 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001097 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001098 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001099 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001100 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001101 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001102 }
1103
1104 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001105 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001106 enumeratorString += string;
1107
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001109 enumeratorString += '|';
1110 }
1111 }
1112
1113 return enumeratorString;
1114}
1115
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001116static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001117 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001118 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001119 return false;
1120 }
1121
1122 return true;
1123}
1124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1126 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001127 return "unrecognized enumerator";
1128 }
1129
1130 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001131 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001132 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001133 }
1134
1135 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001136 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001137 enumeratorString += string;
1138
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001139 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001140 enumeratorString += '|';
1141 }
1142 }
1143
1144 return enumeratorString;
1145}
1146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001147static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1148 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1149 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1150 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001151 return false;
1152 }
1153
1154 return true;
1155}
1156
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001157static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1158 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001159 return "unrecognized enumerator";
1160 }
1161
1162 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001164 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1165 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001166 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001169 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001172 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001173 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1174 }
1175
1176 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001177 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001178 enumeratorString += string;
1179
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001180 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001181 enumeratorString += '|';
1182 }
1183 }
1184
1185 return enumeratorString;
1186}
1187
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001188static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001189 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001190 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001191 return false;
1192 }
1193
1194 return true;
1195}
1196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1198 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001199 return "unrecognized enumerator";
1200 }
1201
1202 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001203 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001204 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001205 }
1206
1207 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001208 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001209 enumeratorString += string;
1210
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001211 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001212 enumeratorString += '|';
1213 }
1214 }
1215
1216 return enumeratorString;
1217}
1218
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001219static const int MaxParamCheckerStringLength = 256;
1220
Dustin Graves080069b2016-04-05 13:48:15 -06001221static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1222 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001223 assert(apiName != nullptr);
1224 assert(stringName != nullptr);
1225 assert(validateString != nullptr);
1226
Dustin Graves080069b2016-04-05 13:48:15 -06001227 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001228
1229 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1230
1231 if (result == VK_STRING_ERROR_NONE) {
1232 return skipCall;
1233 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001234 skipCall =
1235 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1236 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001237 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001238 skipCall =
1239 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1240 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001241 }
1242 return skipCall;
1243}
1244
Dustin Gravesde628532016-04-21 16:30:17 -06001245static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1246 uint32_t index) {
1247 assert(device_data != nullptr);
1248 debug_report_data *report_data = device_data->report_data;
1249 bool skip_call = false;
1250
1251 if (index == VK_QUEUE_FAMILY_IGNORED) {
1252 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1253 "PARAMCHECK", "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
1254 } else {
1255 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1256 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1257 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1258 "PARAMCHECK", "%s: %s (%d) must be one of the indices specified when the device was created, via "
1259 "the VkDeviceQueueCreateInfo structure.",
1260 function_name, parameter_name, index);
1261 return false;
1262 }
1263 }
1264
1265 return skip_call;
1266}
1267
1268static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1269 const uint32_t count, const uint32_t *indices) {
1270 assert(device_data != nullptr);
1271 debug_report_data *report_data = device_data->report_data;
1272 bool skip_call = false;
1273
1274 if (indices != nullptr) {
1275 for (uint32_t i = 0; i < count; i++) {
1276 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1277 skip_call |=
1278 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1279 "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
1280 } else {
1281 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1282 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1283 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1284 "PARAMCHECK", "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1285 "created, via the VkDeviceQueueCreateInfo structure.",
1286 function_name, parameter_name, i, indices[i]);
1287 return false;
1288 }
1289 }
1290 }
1291 }
1292
1293 return skip_call;
1294}
1295
Chia-I Wu01ca2372016-05-13 14:37:49 +08001296VKAPI_ATTR VkResult VKAPI_CALL
1297CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001298 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001299
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001300 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001301 assert(chain_info != nullptr);
1302 assert(chain_info->u.pLayerInfo != nullptr);
1303
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001304 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1305 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001306 if (fpCreateInstance == NULL) {
1307 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001308 }
1309
Dustin Graves842621d2016-03-03 14:17:08 -07001310 // Advance the link info for the next element on the chain
1311 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1312
1313 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001314
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001315 if (result == VK_SUCCESS) {
1316 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1317 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001318
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001319 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001320
Chia-I Wua570b7c2016-05-16 07:48:14 +08001321 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001322 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1323 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001324
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001325 // Look for one or more debug report create info structures
1326 // and setup a callback(s) for each one found.
1327 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1328 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1329 if (my_instance_data->num_tmp_callbacks > 0) {
1330 // Setup the temporary callback(s) here to catch early issues:
1331 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1332 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1333 // Failure of setting up one or more of the callback.
1334 // Therefore, clean up and don't use those callbacks:
1335 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1336 my_instance_data->num_tmp_callbacks = 0;
1337 }
1338 }
1339 }
1340
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001341 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001342
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001343 // Ordinarily we'd check these before calling down the chain, but none of the layer
1344 // support is in place until now, if we survive we can report the issue now.
1345 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001346
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001347 if (pCreateInfo->pApplicationInfo) {
1348 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1349 validate_string(my_instance_data->report_data, "vkCreateInstance",
1350 "pCreateInfo->VkApplicationInfo->pApplicationName",
1351 pCreateInfo->pApplicationInfo->pApplicationName);
1352 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001353
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001354 if (pCreateInfo->pApplicationInfo->pEngineName) {
1355 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1356 pCreateInfo->pApplicationInfo->pEngineName);
1357 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001358 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001359
1360 // Disable the tmp callbacks:
1361 if (my_instance_data->num_tmp_callbacks > 0) {
1362 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1363 my_instance_data->tmp_callbacks);
1364 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001365 }
1366
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001367 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001368}
1369
Chia-I Wu01ca2372016-05-13 14:37:49 +08001370VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001371 // Grab the key before the instance is destroyed.
1372 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001373 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001374 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001375 assert(my_data != NULL);
1376
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001377 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1378 bool callback_setup = false;
1379 if (my_data->num_tmp_callbacks > 0) {
1380 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1381 my_data->tmp_callbacks)) {
1382 callback_setup = true;
1383 }
1384 }
1385
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001386 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001387
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001388 // Disable and cleanup the temporary callback(s):
1389 if (callback_setup) {
1390 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1391 }
1392 if (my_data->num_tmp_callbacks > 0) {
1393 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1394 my_data->num_tmp_callbacks = 0;
1395 }
1396
Dustin Graves080069b2016-04-05 13:48:15 -06001397 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001398 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001399 pTable->DestroyInstance(instance, pAllocator);
1400
1401 // Clean up logging callback, if any
1402 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001403 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1404 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001405 my_data->logging_callback.pop_back();
1406 }
1407
1408 layer_debug_report_destroy_instance(mid(instance));
1409 layer_data_map.erase(pTable);
1410
1411 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001412 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001413 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001414}
1415
Chia-I Wu01ca2372016-05-13 14:37:49 +08001416VKAPI_ATTR VkResult VKAPI_CALL
1417EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001418 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001419 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001421 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001422
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001423 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001424
Dustin Graves080069b2016-04-05 13:48:15 -06001425 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001426 result = get_dispatch_table(pc_instance_table_map, instance)
1427 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001428
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001429 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001431
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001432 return result;
1433}
1434
Chia-I Wu01ca2372016-05-13 14:37:49 +08001435VKAPI_ATTR void VKAPI_CALL
1436GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001437 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001439 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001440
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001441 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001442
Dustin Graves080069b2016-04-05 13:48:15 -06001443 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001444 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001445 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001446}
1447
Chia-I Wu01ca2372016-05-13 14:37:49 +08001448VKAPI_ATTR void VKAPI_CALL
1449GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001450 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001451 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001452 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001453
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001454 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001455
Dustin Graves080069b2016-04-05 13:48:15 -06001456 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001457 get_dispatch_table(pc_instance_table_map, physicalDevice)
1458 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001460}
1461
Chia-I Wu01ca2372016-05-13 14:37:49 +08001462VKAPI_ATTR VkResult VKAPI_CALL
1463GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1464 VkImageUsageFlags usage, VkImageCreateFlags flags,
1465 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001466 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001467 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001468 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001470
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001471 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001472 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001473
Dustin Graves080069b2016-04-05 13:48:15 -06001474 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001475 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1476 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1477 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001478
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001479 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001480 }
Chia-I Wu17241042015-10-31 00:31:16 +08001481
1482 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001483}
1484
Chia-I Wu01ca2372016-05-13 14:37:49 +08001485VKAPI_ATTR void VKAPI_CALL
1486GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001487 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001488 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001490
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001491 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001492
Dustin Graves080069b2016-04-05 13:48:15 -06001493 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001494 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001495 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001496}
1497
Chia-I Wu01ca2372016-05-13 14:37:49 +08001498VKAPI_ATTR void VKAPI_CALL
1499GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1500 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001501 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001502 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001503 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001504
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001505 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001506 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001507
Dustin Graves080069b2016-04-05 13:48:15 -06001508 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001509 get_dispatch_table(pc_instance_table_map, physicalDevice)
1510 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001511 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001512}
1513
Chia-I Wu01ca2372016-05-13 14:37:49 +08001514VKAPI_ATTR void VKAPI_CALL
1515GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001516 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001517 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001518 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001519
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001520 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001521
Dustin Graves080069b2016-04-05 13:48:15 -06001522 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001523 get_dispatch_table(pc_instance_table_map, physicalDevice)
1524 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001525 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001526}
1527
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001528void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1529 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001530 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001531
1532 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1533 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1534 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001535 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1536 INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001537 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1538 "structure.",
1539 i);
1540 } else {
1541 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001542 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001543
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001544 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1545 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1546 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1547 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
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,
1549 __LINE__, INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001550 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1551 "between 0 and 1. Actual value is %f",
1552 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1553 }
1554 }
1555 }
1556
1557 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1558 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001559 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1560 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001561 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1562 "of queue families.",
1563 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001564 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1565 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1566 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001567 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1568 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001569 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1570 "queues for the given family index.",
1571 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001572 }
Michael Lentine774704f2016-01-27 13:36:46 -06001573 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001574 }
1575}
1576
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001577void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001578 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001579
1580 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1581 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1582 my_device_data->queueFamilyIndexMap.insert(
1583 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1584 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001585 }
1586}
1587
Chia-I Wu01ca2372016-05-13 14:37:49 +08001588VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice,
1589 const VkDeviceCreateInfo *pCreateInfo,
1590 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001591 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001592 * NOTE: We do not validate physicalDevice or any dispatchable
1593 * object as the first parameter. We couldn't get here if it was wrong!
1594 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001595
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001596 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001597 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001598 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001599 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001600
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001601 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001602
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001603 if (pCreateInfo != NULL) {
1604 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001605 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001606 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1607 pCreateInfo->ppEnabledLayerNames[i]);
1608 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001609 }
Michael Lentine774704f2016-01-27 13:36:46 -06001610
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001611 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001612 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001613 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1614 pCreateInfo->ppEnabledExtensionNames[i]);
1615 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001616 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001617 }
1618
Dustin Graves080069b2016-04-05 13:48:15 -06001619 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001620 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001621 assert(chain_info != nullptr);
1622 assert(chain_info->u.pLayerInfo != nullptr);
1623
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001624 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1625 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001626 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001627 if (fpCreateDevice == NULL) {
1628 return VK_ERROR_INITIALIZATION_FAILED;
1629 }
1630
1631 // Advance the link info for the next element on the chain
1632 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1633
1634 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001635
1636 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1637
1638 if (result == VK_SUCCESS) {
1639 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1640 assert(my_device_data != nullptr);
1641
1642 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1643 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1644
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001645
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001646 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001647 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1648 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001649 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001650 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001651
1652 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1653 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001654
1655 // Query and save physical device limits for this device
1656 VkPhysicalDeviceProperties device_properties = {};
1657 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1658 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001659 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001660 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001661
Jeremy Hayes99a96322015-06-26 12:48:09 -06001662 return result;
1663}
1664
Chia-I Wu01ca2372016-05-13 14:37:49 +08001665VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001666 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001667 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001668 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1669 assert(my_data != NULL);
1670
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001671 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001672
Dustin Graves080069b2016-04-05 13:48:15 -06001673 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001674 layer_debug_report_destroy_device(device);
1675
Jeremy Hayes99a96322015-06-26 12:48:09 -06001676#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001677 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001678#endif
1679
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001680 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001681 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001682 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001683 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001684}
1685
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001686bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001687 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001688 assert(my_device_data != nullptr);
1689
Dustin Gravesde628532016-04-21 16:30:17 -06001690 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001691
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001692 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001693 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001694 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1695 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001696 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1697 "was created.",
1698 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001699 return false;
1700 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001701
Michael Lentinebdf744f2016-01-27 15:43:43 -06001702 return true;
1703}
1704
Chia-I Wu01ca2372016-05-13 14:37:49 +08001705VKAPI_ATTR void VKAPI_CALL
1706GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001707 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001708 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001709 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001710
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001711 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001712
Dustin Graves080069b2016-04-05 13:48:15 -06001713 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001714 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1715
1716 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001717 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001718}
1719
Chia-I Wu01ca2372016-05-13 14:37:49 +08001720VKAPI_ATTR VkResult VKAPI_CALL
1721QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001722 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001723 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001725 assert(my_data != NULL);
1726
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001727 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001728
Dustin Graves080069b2016-04-05 13:48:15 -06001729 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001730 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1731
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001732 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001733 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001734
Jeremy Hayes99a96322015-06-26 12:48:09 -06001735 return result;
1736}
1737
Chia-I Wu01ca2372016-05-13 14:37:49 +08001738VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001739 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1740 assert(my_data != NULL);
1741
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001742 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001743
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001744 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001745
1746 return result;
1747}
1748
Chia-I Wu01ca2372016-05-13 14:37:49 +08001749VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001750 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1751 assert(my_data != NULL);
1752
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001753 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001754
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001755 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001756
1757 return result;
1758}
1759
Chia-I Wu01ca2372016-05-13 14:37:49 +08001760VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001761 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1762 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001763 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001764 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001765 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001766
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001767 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001768
Dustin Graves080069b2016-04-05 13:48:15 -06001769 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001770 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1771
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001772 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001773 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001774
1775 return result;
1776}
1777
Chia-I Wu01ca2372016-05-13 14:37:49 +08001778VKAPI_ATTR void VKAPI_CALL
1779FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001780 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001781 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001782 assert(my_data != NULL);
1783
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001784 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001785
Dustin Graves080069b2016-04-05 13:48:15 -06001786 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001787 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001788 }
1789}
1790
Chia-I Wu01ca2372016-05-13 14:37:49 +08001791VKAPI_ATTR VkResult VKAPI_CALL
1792MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001793 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001794 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001796 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001797
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001798 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001799
Dustin Graves080069b2016-04-05 13:48:15 -06001800 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001801 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1802
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001803 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001804 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001805
1806 return result;
1807}
1808
Chia-I Wu01ca2372016-05-13 14:37:49 +08001809VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001810 bool skipCall = false;
1811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1812 assert(my_data != NULL);
1813
1814 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1815
1816 if (!skipCall) {
1817 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1818 }
1819}
1820
Chia-I Wu01ca2372016-05-13 14:37:49 +08001821VKAPI_ATTR VkResult VKAPI_CALL
1822FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001824 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001826 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001827
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001828 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001829
Dustin Graves080069b2016-04-05 13:48:15 -06001830 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001831 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1832
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001833 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001834 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001835
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001836 return result;
1837}
1838
Chia-I Wu01ca2372016-05-13 14:37:49 +08001839VKAPI_ATTR VkResult VKAPI_CALL
1840InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001842 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001843 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001844 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001845
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001846 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001847
Dustin Graves080069b2016-04-05 13:48:15 -06001848 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001849 result =
1850 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001851
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001852 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001853 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001854
Tony Barbourb1250542015-04-16 19:23:13 -06001855 return result;
1856}
1857
Chia-I Wu01ca2372016-05-13 14:37:49 +08001858VKAPI_ATTR void VKAPI_CALL
1859GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001860 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001861 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001862 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001863
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001864 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001865
Dustin Graves080069b2016-04-05 13:48:15 -06001866 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001867 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001868 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001869}
1870
Chia-I Wu01ca2372016-05-13 14:37:49 +08001871VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1872 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001873 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1874 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001875 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1876 assert(my_data != NULL);
1877
Dustin Graves20fd66f2016-04-18 18:33:21 -06001878 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001879
Dustin Graves20fd66f2016-04-18 18:33:21 -06001880 if (!skipCall) {
1881 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1882
1883 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1884 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001885
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001886 return result;
1887}
1888
Chia-I Wu01ca2372016-05-13 14:37:49 +08001889VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1890 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001891 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1892 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001893 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1894 assert(my_data != NULL);
1895
Dustin Graves20fd66f2016-04-18 18:33:21 -06001896 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001897
Dustin Graves20fd66f2016-04-18 18:33:21 -06001898 if (!skipCall) {
1899 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1900
1901 validate_result(my_data->report_data, "vkBindImageMemory", result);
1902 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001903
1904 return result;
1905}
1906
Chia-I Wu01ca2372016-05-13 14:37:49 +08001907VKAPI_ATTR void VKAPI_CALL
1908GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001909 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001910 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001912
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001913 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914
Dustin Graves080069b2016-04-05 13:48:15 -06001915 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001916 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001918}
1919
Chia-I Wu01ca2372016-05-13 14:37:49 +08001920VKAPI_ATTR void VKAPI_CALL
1921GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001922 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001923 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001924 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001925
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001926 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927
Dustin Graves080069b2016-04-05 13:48:15 -06001928 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001929 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001930 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001931}
1932
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001933bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1934 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1935 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001936 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001937 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1938 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001939 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1940 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001941 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1942 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001943 return false;
1944 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001945 }
1946
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001947 return true;
1948}
1949
Chia-I Wu01ca2372016-05-13 14:37:49 +08001950VKAPI_ATTR void VKAPI_CALL
1951GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1952 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001953 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001954 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001955 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001956
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001957 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001958 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001959
Dustin Graves080069b2016-04-05 13:48:15 -06001960 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001961 get_dispatch_table(pc_device_table_map, device)
1962 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001963
1964 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1965 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001966}
1967
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001968bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1969 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1970 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001971 if (pProperties != nullptr) {
1972 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1973 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001974 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1975 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001976 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1977 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001978 return false;
1979 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001980 }
1981
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001982 return true;
1983}
1984
Chia-I Wu01ca2372016-05-13 14:37:49 +08001985VKAPI_ATTR void VKAPI_CALL
1986GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1987 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1988 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001989 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001990 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001991 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001992
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001993 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001994 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001995
Dustin Graves080069b2016-04-05 13:48:15 -06001996 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001997 get_dispatch_table(pc_instance_table_map, physicalDevice)
1998 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1999 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002000
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002001 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2002 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002003 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002004}
2005
Chia-I Wu01ca2372016-05-13 14:37:49 +08002006VKAPI_ATTR VkResult VKAPI_CALL
2007QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002008 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002009 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002010 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002011 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002012
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002013 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002014
Dustin Graves080069b2016-04-05 13:48:15 -06002015 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002016 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2017
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002018 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002020
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002021 return result;
2022}
2023
Chia-I Wu01ca2372016-05-13 14:37:49 +08002024VKAPI_ATTR VkResult VKAPI_CALL
2025CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002026 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002027 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002028 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002029 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002030
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002031 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002032
Dustin Graves080069b2016-04-05 13:48:15 -06002033 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002034 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2035
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002036 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002037 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002038
2039 return result;
2040}
2041
Chia-I Wu01ca2372016-05-13 14:37:49 +08002042VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002043 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002045 assert(my_data != NULL);
2046
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002047 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002048
Dustin Graves080069b2016-04-05 13:48:15 -06002049 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002050 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002051 }
2052}
2053
Chia-I Wu01ca2372016-05-13 14:37:49 +08002054VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002055 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002056 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002057 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002058 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002059
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002060 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002061
Dustin Graves080069b2016-04-05 13:48:15 -06002062 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2064
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002065 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002066 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002067
2068 return result;
2069}
2070
Chia-I Wu01ca2372016-05-13 14:37:49 +08002071VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002072 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2073 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002074 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2075 assert(my_data != NULL);
2076
Dustin Graves20fd66f2016-04-18 18:33:21 -06002077 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002078
Dustin Graves20fd66f2016-04-18 18:33:21 -06002079 if (!skipCall) {
2080 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2081
2082 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2083 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002084
2085 return result;
2086}
2087
Chia-I Wu01ca2372016-05-13 14:37:49 +08002088VKAPI_ATTR VkResult VKAPI_CALL
2089WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002090 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002091 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002092 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002093 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002094
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002095 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002096
Dustin Graves080069b2016-04-05 13:48:15 -06002097 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002098 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2099
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002100 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002101 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002102
2103 return result;
2104}
2105
Chia-I Wu01ca2372016-05-13 14:37:49 +08002106VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002107 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2108 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002109 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002110 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002111 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002112
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002113 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002114
Dustin Graves080069b2016-04-05 13:48:15 -06002115 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002116 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2117
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002118 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002119 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002120
2121 return result;
2122}
2123
Chia-I Wu01ca2372016-05-13 14:37:49 +08002124VKAPI_ATTR void VKAPI_CALL
2125DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002126 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002127 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002128 assert(my_data != NULL);
2129
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002130 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002131
Dustin Graves080069b2016-04-05 13:48:15 -06002132 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002133 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002134 }
2135}
2136
Chia-I Wu01ca2372016-05-13 14:37:49 +08002137VKAPI_ATTR VkResult VKAPI_CALL
2138CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002139 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002140 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002141 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002142 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002143
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002144 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002145
Dustin Graves080069b2016-04-05 13:48:15 -06002146 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002147 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2148
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002149 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002150 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002151
2152 return result;
2153}
2154
Chia-I Wu01ca2372016-05-13 14:37:49 +08002155VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002156 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002158 assert(my_data != NULL);
2159
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002160 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002161
Dustin Graves080069b2016-04-05 13:48:15 -06002162 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002163 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002164 }
2165}
2166
Chia-I Wu01ca2372016-05-13 14:37:49 +08002167VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002168 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2169 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002170 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2171 assert(my_data != NULL);
2172
Dustin Graves20fd66f2016-04-18 18:33:21 -06002173 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002174
Dustin Graves20fd66f2016-04-18 18:33:21 -06002175 if (!skipCall) {
2176 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2177
2178 validate_result(my_data->report_data, "vkGetEventStatus", result);
2179 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002180
2181 return result;
2182}
2183
Chia-I Wu01ca2372016-05-13 14:37:49 +08002184VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002185 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2186 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002187 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2188 assert(my_data != NULL);
2189
Dustin Graves20fd66f2016-04-18 18:33:21 -06002190 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002191
Dustin Graves20fd66f2016-04-18 18:33:21 -06002192 if (!skipCall) {
2193 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2194
2195 validate_result(my_data->report_data, "vkSetEvent", result);
2196 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002197
2198 return result;
2199}
2200
Chia-I Wu01ca2372016-05-13 14:37:49 +08002201VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002202 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2203 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002204 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2205 assert(my_data != NULL);
2206
Dustin Graves20fd66f2016-04-18 18:33:21 -06002207 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002208
Dustin Graves20fd66f2016-04-18 18:33:21 -06002209 if (!skipCall) {
2210 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2211
2212 validate_result(my_data->report_data, "vkResetEvent", result);
2213 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002214
2215 return result;
2216}
2217
Chia-I Wu01ca2372016-05-13 14:37:49 +08002218VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2219 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002220 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002221 bool skip_call = false;
2222 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2223 assert(device_data != nullptr);
2224 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002225
Dustin Gravesc900f572016-05-16 11:07:59 -06002226 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002227
Dustin Gravesc900f572016-05-16 11:07:59 -06002228 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2229 if (pCreateInfo != nullptr) {
2230 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2231 // VkQueryPipelineStatisticFlagBits values
2232 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2233 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2234 skip_call |=
2235 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2236 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2237 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2238 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2239 }
2240 }
2241
2242 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002243 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2244
Dustin Gravesc900f572016-05-16 11:07:59 -06002245 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002246 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002247
2248 return result;
2249}
2250
Chia-I Wu01ca2372016-05-13 14:37:49 +08002251VKAPI_ATTR void VKAPI_CALL
2252DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002253 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002254 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002255 assert(my_data != NULL);
2256
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002257 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002258
Dustin Graves080069b2016-04-05 13:48:15 -06002259 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002260 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002261 }
2262}
2263
Chia-I Wu01ca2372016-05-13 14:37:49 +08002264VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2265 uint32_t queryCount, size_t dataSize, void *pData,
2266 VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002267 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002268 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002270 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002271
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002272 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002273 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002274
Dustin Graves080069b2016-04-05 13:48:15 -06002275 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002276 result = get_dispatch_table(pc_device_table_map, device)
2277 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002278
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002279 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002280 }
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
2286CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
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_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002294
Dustin Gravesc900f572016-05-16 11:07:59 -06002295 if (pCreateInfo != nullptr) {
2296 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2297 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2298 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2299 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2300 skip_call |=
2301 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2302 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2303 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2304 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002305
Dustin Gravesc900f572016-05-16 11:07:59 -06002306 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2307 // queueFamilyIndexCount uint32_t values
2308 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2309 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2310 __LINE__, REQUIRED_PARAMETER, LayerName,
2311 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2312 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2313 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2314 }
2315
2316 // Ensure that the queue family indices were specified at device creation
2317 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2318 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2319 }
2320 }
2321
2322 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002323 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2324
Dustin Gravesc900f572016-05-16 11:07:59 -06002325 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002326 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002327
2328 return result;
2329}
2330
Chia-I Wu01ca2372016-05-13 14:37:49 +08002331VKAPI_ATTR void VKAPI_CALL
2332DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002333 bool skipCall = 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 Graves27a912a2016-03-07 17:52:14 -07002335 assert(my_data != NULL);
2336
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002337 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002338
Dustin Graves080069b2016-04-05 13:48:15 -06002339 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002341 }
2342}
2343
Chia-I Wu01ca2372016-05-13 14:37:49 +08002344VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2345 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002346 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002347 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002348 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002349 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002350
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002351 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002352
Dustin Graves080069b2016-04-05 13:48:15 -06002353 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002354 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2355
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002356 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002357 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002358
2359 return result;
2360}
2361
Chia-I Wu01ca2372016-05-13 14:37:49 +08002362VKAPI_ATTR void VKAPI_CALL
2363DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002364 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002366 assert(my_data != NULL);
2367
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002368 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002369
Dustin Graves080069b2016-04-05 13:48:15 -06002370 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002371 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002372 }
2373}
2374
Chia-I Wu01ca2372016-05-13 14:37:49 +08002375VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2376 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002377 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2378 bool skip_call = false;
2379 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002380 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002381 debug_report_data *report_data = device_data->report_data;
2382
2383 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2384
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002385 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002386 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002387 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002388 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2389 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2390 skip_call |=
2391 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2392 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2393 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2394 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002395
Dustin Gravesc900f572016-05-16 11:07:59 -06002396 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2397 // queueFamilyIndexCount uint32_t values
2398 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2399 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2400 __LINE__, REQUIRED_PARAMETER, LayerName,
2401 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2402 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2403 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2404 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002405
2406 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2407 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2408 }
2409
2410 // width, height, and depth members of extent must be greater than 0
2411 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2412 0u);
2413 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2414 0u);
2415 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2416 0u);
2417
2418 // mipLevels must be greater than 0
2419 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2420 0u);
2421
2422 // arrayLayers must be greater than 0
2423 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2424 0u);
2425
2426 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2427 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2428 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2429 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2430 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
2431 }
2432
2433 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2434 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2435 // extent.height must be equal
2436 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2437 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2438 skip_call |=
2439 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2440 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2441 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2442 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
2443 }
2444
2445 if (pCreateInfo->extent.depth != 1) {
2446 skip_call |=
2447 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2448 LayerName,
2449 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2450 }
2451 }
2452
2453 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2454 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2455 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2456 skip_call |= log_msg(
2457 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2458 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2459 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2460 }
2461
2462 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2463 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2464 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2465 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2466 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2467 LayerName,
2468 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2469 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002470 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002471 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002472
Dustin Gravesf8032f22016-05-11 18:31:44 -06002473 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002474 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2475
Dustin Gravesf8032f22016-05-11 18:31:44 -06002476 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002477 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002478
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002479 return result;
2480}
2481
Chia-I Wu01ca2372016-05-13 14:37:49 +08002482VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002483 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002484 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002485 assert(my_data != NULL);
2486
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002487 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002488
Dustin Graves080069b2016-04-05 13:48:15 -06002489 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002490 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002491 }
2492}
2493
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002494bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2495 if (pSubresource != nullptr) {
2496 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2497 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002498 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2499 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002500 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2501 return false;
2502 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002503 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002504
2505 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002506}
2507
Chia-I Wu01ca2372016-05-13 14:37:49 +08002508VKAPI_ATTR void VKAPI_CALL
2509GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002510 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002511 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002512 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002513
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002514 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002515
Dustin Graves080069b2016-04-05 13:48:15 -06002516 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002517 PreGetImageSubresourceLayout(device, pSubresource);
2518
2519 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002520 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002521}
2522
Chia-I Wu01ca2372016-05-13 14:37:49 +08002523VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2524 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002525 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002526 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002527 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002528 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002529 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002530
Dustin Graves0b70a632016-04-27 17:44:56 -06002531 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002532
Dustin Graves0b70a632016-04-27 17:44:56 -06002533 if (pCreateInfo != nullptr) {
2534 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2535 if (pCreateInfo->subresourceRange.layerCount != 1) {
2536 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2537 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2538 "pCreateInfo->subresourceRange.layerCount must be 1",
2539 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2540 }
2541 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2542 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)) {
2543 if (pCreateInfo->subresourceRange.layerCount < 1) {
2544 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2545 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2546 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2547 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2548 }
2549 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2550 if (pCreateInfo->subresourceRange.layerCount != 6) {
2551 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2552 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2553 "pCreateInfo->subresourceRange.layerCount must be 6");
2554 }
2555 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2556 if ((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) {
2557 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2558 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2559 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2560 }
2561 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2562 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2563 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2564 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2565 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2566 }
2567
2568 if (pCreateInfo->subresourceRange.layerCount != 1) {
2569 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2570 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2571 "pCreateInfo->subresourceRange.layerCount must be 1");
2572 }
2573 }
2574 }
2575
2576 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002577 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2578
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002579 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002580 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002581
2582 return result;
2583}
2584
Chia-I Wu01ca2372016-05-13 14:37:49 +08002585VKAPI_ATTR void VKAPI_CALL
2586DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002587 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002589 assert(my_data != NULL);
2590
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002591 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002592
Dustin Graves080069b2016-04-05 13:48:15 -06002593 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002594 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002595 }
2596}
2597
Chia-I Wu01ca2372016-05-13 14:37:49 +08002598VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2599 const VkAllocationCallbacks *pAllocator,
2600 VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002601 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002602 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002603 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002604 assert(my_data != NULL);
2605
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002606 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002607
Dustin Graves080069b2016-04-05 13:48:15 -06002608 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002609 result =
2610 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002611
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002612 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002613 }
2614
Michael Lentine03d8e572015-09-15 14:59:14 -05002615 return result;
2616}
2617
Chia-I Wu01ca2372016-05-13 14:37:49 +08002618VKAPI_ATTR void VKAPI_CALL
2619DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002620 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002621 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002622 assert(my_data != NULL);
2623
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002624 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002625
Dustin Graves080069b2016-04-05 13:48:15 -06002626 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002627 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002628 }
2629}
2630
Chia-I Wu01ca2372016-05-13 14:37:49 +08002631VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2632 const VkAllocationCallbacks *pAllocator,
2633 VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002634 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002635 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002636 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002637 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002638
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002639 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002640
Dustin Graves080069b2016-04-05 13:48:15 -06002641 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002642 result =
2643 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002644
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002645 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002646 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002647
2648 return result;
2649}
2650
Chia-I Wu01ca2372016-05-13 14:37:49 +08002651VKAPI_ATTR void VKAPI_CALL
2652DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002653 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002654 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002655 assert(my_data != NULL);
2656
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002657 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002658
Dustin Graves080069b2016-04-05 13:48:15 -06002659 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002660 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002661 }
2662}
2663
Chia-I Wu01ca2372016-05-13 14:37:49 +08002664VKAPI_ATTR VkResult VKAPI_CALL
2665GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002666 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002667 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002668 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002669 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002670
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002671 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002672
Dustin Graves080069b2016-04-05 13:48:15 -06002673 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002674 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2675
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002676 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002677 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002678
2679 return result;
2680}
2681
Chia-I Wu01ca2372016-05-13 14:37:49 +08002682VKAPI_ATTR VkResult VKAPI_CALL
2683MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002685 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002687 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002688
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002689 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002690
Dustin Graves080069b2016-04-05 13:48:15 -06002691 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002692 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2693
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002694 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002695 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002696
2697 return result;
2698}
2699
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002701 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2702
2703 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002704 if (pCreateInfos != nullptr) {
2705 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2706 if (pCreateInfos->basePipelineIndex != -1) {
2707 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002708 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2709 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002710 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2711 "pCreateInfos->flags "
2712 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2713 return false;
2714 }
2715 }
2716
2717 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2718 if (pCreateInfos->basePipelineIndex != -1) {
2719 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002720 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2721 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002722 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2723 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2724 "VK_NULL_HANDLE");
2725 return false;
2726 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002727 }
2728 }
2729
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002730 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002731 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002732 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2733 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002734 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2735 "unrecognized enumerator");
2736 return false;
2737 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002738 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002739
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002740 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002741 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002742 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002743 pCreateInfos[i].pStages[j].pName);
2744 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002745 }
2746
2747 return true;
2748}
2749
Chia-I Wu01ca2372016-05-13 14:37:49 +08002750VKAPI_ATTR VkResult VKAPI_CALL
2751CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2752 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2753 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002754 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002755 bool skip_call = false;
2756 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2757 assert(device_data != nullptr);
2758 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002759
Dustin Gravesc900f572016-05-16 11:07:59 -06002760 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2761 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002762
Dustin Gravesc900f572016-05-16 11:07:59 -06002763 if (pCreateInfos != nullptr) {
2764 for (uint32_t i = 0; i < createInfoCount; ++i) {
2765 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2766 if (pCreateInfos[i].pTessellationState == nullptr) {
2767 if (pCreateInfos[i].pStages != nullptr) {
2768 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2769 // pTessellationState must not be NULL
2770 bool has_control = false;
2771 bool has_eval = false;
2772
2773 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2774 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2775 has_control = true;
2776 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2777 has_eval = true;
2778 }
2779 }
2780
2781 if (has_control && has_eval) {
2782 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2783 __LINE__, REQUIRED_PARAMETER, LayerName,
2784 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2785 "control shader stage and a tessellation evaluation shader stage, "
2786 "pCreateInfos[%d].pTessellationState must not be NULL",
2787 i, i);
2788 }
2789 }
Dustin Graves629259b2016-05-30 16:14:27 -06002790 } else {
2791 skip_call |=
2792 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
2793 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL);
2794
2795 skip_call |=
2796 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2797 pCreateInfos[i].pTessellationState->flags);
2798
2799 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2800 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2801 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2802 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2803 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2804 i);
2805 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002806 }
2807
2808 if (pCreateInfos[i].pViewportState == nullptr) {
2809 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2810 // valid VkPipelineViewportStateCreateInfo structure
2811 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2812 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2813 skip_call |= log_msg(
2814 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2815 REQUIRED_PARAMETER, LayerName,
2816 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2817 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2818 i, i);
2819 }
2820 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002821 skip_call |=
2822 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
2823 pCreateInfos[i].pViewportState->pNext, 0, NULL);
2824
2825 skip_call |=
2826 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2827 pCreateInfos[i].pViewportState->flags);
2828
Dustin Gravesc900f572016-05-16 11:07:59 -06002829 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2830 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2831 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2832 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2833 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2834 i);
2835 }
2836
2837 if (pCreateInfos[i].pDynamicState != nullptr) {
2838 bool has_dynamic_viewport = false;
2839 bool has_dynamic_scissor = false;
2840
2841 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2842 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2843 has_dynamic_viewport = true;
2844 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2845 has_dynamic_scissor = true;
2846 }
2847 }
2848
2849 // viewportCount must be greater than 0
2850 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2851 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2852 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2853 __LINE__, REQUIRED_PARAMETER, LayerName,
2854 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2855 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2856 "must be greater than 0",
2857 i, i);
2858 }
2859
2860 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2861 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2862 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2863 skip_call |=
2864 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2865 __LINE__, REQUIRED_PARAMETER, LayerName,
2866 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2867 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2868 i, i);
2869 }
2870
2871 // scissorCount must be greater than 0
2872 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2873 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2874 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2875 __LINE__, REQUIRED_PARAMETER, LayerName,
2876 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2877 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2878 "must be greater than 0",
2879 i, i);
2880 }
2881
2882 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2883 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2884 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2885 skip_call |=
2886 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2887 __LINE__, REQUIRED_PARAMETER, LayerName,
2888 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2889 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2890 i, i);
2891 }
2892 }
2893 }
2894
2895 if (pCreateInfos[i].pMultisampleState == nullptr) {
2896 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2897 // a valid VkPipelineMultisampleStateCreateInfo structure
2898 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2899 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2900 skip_call |=
2901 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2902 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2903 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2904 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2905 i, i);
2906 }
Dustin Graves629259b2016-05-30 16:14:27 -06002907 } else {
2908 skip_call |=
2909 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
2910 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL);
2911
2912 skip_call |=
2913 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2914 pCreateInfos[i].pMultisampleState->flags);
2915
2916 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2917 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2918 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2919
2920 skip_call |= validate_array(
2921 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2922 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2923 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2924
2925 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2926 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2927 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2928
2929 skip_call |=
2930 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2931 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
2932
2933 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2934 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2935 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2936 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2937 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2938 i);
2939 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002940 }
2941
2942 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06002943 if (pCreateInfos[i].pDepthStencilState != nullptr) {
2944 skip_call |=
2945 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
2946 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL);
2947
2948 skip_call |=
2949 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
2950 pCreateInfos[i].pDepthStencilState->flags);
2951
2952 skip_call |=
2953 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
2954 pCreateInfos[i].pDepthStencilState->depthTestEnable);
2955
2956 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2957 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
2958 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
2959
2960 skip_call |= validate_ranged_enum(
2961 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
2962 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
2963
2964 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2965 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
2966 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
2967
2968 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2969 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
2970 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
2971
2972 skip_call |= validate_ranged_enum(
2973 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
2974 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
2975
2976 skip_call |= validate_ranged_enum(
2977 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
2978 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
2979
2980 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
2981 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
2982 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
2983 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
2984
2985 skip_call |= validate_ranged_enum(
2986 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
2987 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
2988
2989 skip_call |= validate_ranged_enum(
2990 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
2991 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
2992
2993 skip_call |= validate_ranged_enum(
2994 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
2995 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
2996
2997 skip_call |= validate_ranged_enum(
2998 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
2999 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3000
3001 skip_call |= validate_ranged_enum(
3002 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
3003 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
3004
3005 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3006 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3007 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3008 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3009 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3010 i);
3011 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003012 }
3013
3014 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3015 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003016 skip_call |=
3017 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
3018 pCreateInfos[i].pColorBlendState->pNext, 0, NULL);
3019
3020 skip_call |=
3021 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3022 pCreateInfos[i].pColorBlendState->flags);
3023
3024 skip_call |=
3025 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3026 pCreateInfos[i].pColorBlendState->logicOpEnable);
3027
3028 skip_call |= validate_array(
3029 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3030 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3031 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3032
3033 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3034 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3035 ++attachmentIndex) {
3036 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3037 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3038 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3039
3040 skip_call |= validate_ranged_enum(
3041 report_data, "vkCreateGraphicsPipelines",
3042 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3043 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3044 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3045
3046 skip_call |= validate_ranged_enum(
3047 report_data, "vkCreateGraphicsPipelines",
3048 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3049 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3050 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3051
3052 skip_call |= validate_ranged_enum(
3053 report_data, "vkCreateGraphicsPipelines",
3054 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3055 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3056
3057 skip_call |= validate_ranged_enum(
3058 report_data, "vkCreateGraphicsPipelines",
3059 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3060 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3061 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3062
3063 skip_call |= validate_ranged_enum(
3064 report_data, "vkCreateGraphicsPipelines",
3065 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3066 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3067 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3068
3069 skip_call |= validate_ranged_enum(
3070 report_data, "vkCreateGraphicsPipelines",
3071 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3072 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3073
3074 skip_call |=
3075 validate_flags(report_data, "vkCreateGraphicsPipelines",
3076 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3077 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3078 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3079 }
3080 }
3081
Dustin Gravesc900f572016-05-16 11:07:59 -06003082 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3083 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3084 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3085 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3086 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3087 i);
3088 }
3089
3090 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3091 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3092 skip_call |= validate_ranged_enum(
3093 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3094 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3095 }
3096 }
3097 }
3098 }
3099
3100 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003101 PreCreateGraphicsPipelines(device, pCreateInfos);
3102
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003103 result = get_dispatch_table(pc_device_table_map, device)
3104 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003105
Dustin Gravesc900f572016-05-16 11:07:59 -06003106 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003107 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003108
3109 return result;
3110}
3111
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003112bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003113 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3114
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003115 if (pCreateInfos != nullptr) {
3116 // TODO: Handle count!
3117 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003118 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003119 }
3120
3121 return true;
3122}
3123
Chia-I Wu01ca2372016-05-13 14:37:49 +08003124VKAPI_ATTR VkResult VKAPI_CALL
3125CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3126 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3127 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003128 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003129 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003130 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003131 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003132
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003133 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003134 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003135
Dustin Graves080069b2016-04-05 13:48:15 -06003136 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003137 PreCreateComputePipelines(device, pCreateInfos);
3138
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003139 result = get_dispatch_table(pc_device_table_map, device)
3140 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003141
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003142 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003143 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003144
3145 return result;
3146}
3147
Chia-I Wu01ca2372016-05-13 14:37:49 +08003148VKAPI_ATTR void VKAPI_CALL
3149DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003150 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003151 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003152 assert(my_data != NULL);
3153
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003154 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003155
Dustin Graves080069b2016-04-05 13:48:15 -06003156 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003157 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003158 }
3159}
3160
Chia-I Wu01ca2372016-05-13 14:37:49 +08003161VKAPI_ATTR VkResult VKAPI_CALL
3162CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3163 VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003164 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003165 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003167 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003168
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003169 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003170
Dustin Graves080069b2016-04-05 13:48:15 -06003171 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003172 result =
3173 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003174
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003175 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003176 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003177
3178 return result;
3179}
3180
Chia-I Wu01ca2372016-05-13 14:37:49 +08003181VKAPI_ATTR void VKAPI_CALL
3182DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003183 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003185 assert(my_data != NULL);
3186
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003187 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003188
Dustin Graves080069b2016-04-05 13:48:15 -06003189 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003190 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003191 }
3192}
3193
Chia-I Wu01ca2372016-05-13 14:37:49 +08003194VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3195 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003196 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003197 bool skip_call = false;
3198 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3199 assert(device_data != NULL);
3200 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003201
Dustin Gravesc900f572016-05-16 11:07:59 -06003202 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003203
Dustin Gravesc900f572016-05-16 11:07:59 -06003204 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3205 if (pCreateInfo != nullptr) {
3206 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3207 if (pCreateInfo->compareEnable == VK_TRUE) {
3208 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3209 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3210 }
3211
3212 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3213 // valid VkBorderColor value
3214 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3215 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3216 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3217 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3218 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3219 }
3220 }
3221
3222 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003223 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3224
Dustin Gravesc900f572016-05-16 11:07:59 -06003225 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003226 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003227
3228 return result;
3229}
3230
Chia-I Wu01ca2372016-05-13 14:37:49 +08003231VKAPI_ATTR void VKAPI_CALL
3232DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003233 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003234 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003235 assert(my_data != NULL);
3236
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003237 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003238
Dustin Graves080069b2016-04-05 13:48:15 -06003239 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003240 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003241 }
3242}
3243
Chia-I Wu01ca2372016-05-13 14:37:49 +08003244VKAPI_ATTR VkResult VKAPI_CALL
3245CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3246 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003247 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003248 bool skip_call = false;
3249 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3250 assert(device_data != nullptr);
3251 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003252
Dustin Gravesc900f572016-05-16 11:07:59 -06003253 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003254
Dustin Gravesc900f572016-05-16 11:07:59 -06003255 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3256 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3257 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3258 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3259 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3260 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3261 // valid VkSampler handles
3262 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3263 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3264 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3265 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3266 ++descriptor_index) {
3267 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3268 skip_call |=
3269 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3270 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3271 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3272 " specified as VK_NULL_HANDLE",
3273 i, descriptor_index);
3274 }
3275 }
3276 }
3277
3278 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3279 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3280 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3281 skip_call |=
3282 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3283 UNRECOGNIZED_VALUE, LayerName,
3284 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3285 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3286 i, i);
3287 }
3288 }
3289 }
3290 }
3291
3292 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003293 result =
3294 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003295
Dustin Gravesc900f572016-05-16 11:07:59 -06003296 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003297 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003298
3299 return result;
3300}
3301
Chia-I Wu01ca2372016-05-13 14:37:49 +08003302VKAPI_ATTR void VKAPI_CALL
3303DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003304 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003305 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003306 assert(my_data != NULL);
3307
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003308 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003309
Dustin Graves080069b2016-04-05 13:48:15 -06003310 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003312 }
3313}
3314
Chia-I Wu01ca2372016-05-13 14:37:49 +08003315VKAPI_ATTR VkResult VKAPI_CALL
3316CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3317 VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003318 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003319 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003320 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003321 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003322
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003323 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003324
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003325 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3326
Dustin Graves080069b2016-04-05 13:48:15 -06003327 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003328 result =
3329 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003330
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003331 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003332 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003333
3334 return result;
3335}
3336
Chia-I Wu01ca2372016-05-13 14:37:49 +08003337VKAPI_ATTR void VKAPI_CALL
3338DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003339 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003340 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003341 assert(my_data != NULL);
3342
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003343 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003344
Dustin Graves080069b2016-04-05 13:48:15 -06003345 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003346 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003347 }
3348}
3349
Chia-I Wu01ca2372016-05-13 14:37:49 +08003350VKAPI_ATTR VkResult VKAPI_CALL
3351ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003352 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3353 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003354 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3355 assert(my_data != NULL);
3356
Dustin Graves20fd66f2016-04-18 18:33:21 -06003357 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003358
Dustin Graves20fd66f2016-04-18 18:33:21 -06003359 if (!skipCall) {
3360 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3361
3362 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3363 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003364
3365 return result;
3366}
3367
Chia-I Wu01ca2372016-05-13 14:37:49 +08003368VKAPI_ATTR VkResult VKAPI_CALL
3369AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003370 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003371 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003372 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003373 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003374
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003375 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003376
Dustin Graves080069b2016-04-05 13:48:15 -06003377 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003378 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3379
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003380 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003381 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003382
3383 return result;
3384}
3385
Chia-I Wu01ca2372016-05-13 14:37:49 +08003386VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3387 uint32_t descriptorSetCount,
3388 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003389 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003390 bool skip_call = false;
3391 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3392 assert(device_data != nullptr);
3393 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003394
Dustin Gravesc900f572016-05-16 11:07:59 -06003395 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003396
Dustin Gravesc900f572016-05-16 11:07:59 -06003397 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3398 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3399 // validate_array()
3400 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3401 pDescriptorSets, true, true);
3402
3403 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003404 result = get_dispatch_table(pc_device_table_map, device)
3405 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003406
Dustin Gravesc900f572016-05-16 11:07:59 -06003407 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003408 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003409
3410 return result;
3411}
3412
Chia-I Wu01ca2372016-05-13 14:37:49 +08003413VKAPI_ATTR void VKAPI_CALL
3414UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3415 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003416 bool skip_call = false;
3417 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3418 assert(device_data != NULL);
3419 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003420
Dustin Gravesc900f572016-05-16 11:07:59 -06003421 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3422 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003423
Dustin Gravesc900f572016-05-16 11:07:59 -06003424 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3425 if (pDescriptorWrites != NULL) {
3426 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3427 // descriptorCount must be greater than 0
3428 if (pDescriptorWrites[i].descriptorCount == 0) {
3429 skip_call |=
3430 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3431 REQUIRED_PARAMETER, LayerName,
3432 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3433 }
3434
3435 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3436 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3437 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3438 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3439 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3440 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3441 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3442 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3443 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3444 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3445 __LINE__, REQUIRED_PARAMETER, LayerName,
3446 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3447 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3448 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3449 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3450 i, i);
3451 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3452 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3453 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3454 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3455 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3456 ++descriptor_index) {
3457 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3458 "pDescriptorWrites[i].pImageInfo[i].imageView",
3459 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3460 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3461 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3462 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3463 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3464 }
3465 }
3466 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3467 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3468 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3469 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3470 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3471 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3472 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3473 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3474 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3475 __LINE__, REQUIRED_PARAMETER, LayerName,
3476 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3477 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3478 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3479 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3480 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003481 } else {
3482 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3483 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3484 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3485 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3486 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003487 }
3488 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3489 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3490 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3491 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3492 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3493 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3494 __LINE__, REQUIRED_PARAMETER, LayerName,
3495 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3496 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3497 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3498 i, i);
3499 } else {
3500 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3501 ++descriptor_index) {
3502 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3503 "pDescriptorWrites[i].pTexelBufferView[i]",
3504 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3505 }
3506 }
3507 }
3508 }
3509 }
3510
3511 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003512 get_dispatch_table(pc_device_table_map, device)
3513 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003514 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003515}
3516
Chia-I Wu01ca2372016-05-13 14:37:49 +08003517VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3518 const VkAllocationCallbacks *pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003519 VkFramebuffer *pFramebuffer) {
3520 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003521 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003522 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003523 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003524
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003525 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003526
Dustin Graves080069b2016-04-05 13:48:15 -06003527 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003528 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3529
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003530 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003531 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003532
3533 return result;
3534}
3535
Chia-I Wu01ca2372016-05-13 14:37:49 +08003536VKAPI_ATTR void VKAPI_CALL
3537DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003538 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003539 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003540 assert(my_data != NULL);
3541
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003542 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003543
Dustin Graves080069b2016-04-05 13:48:15 -06003544 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003545 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003546 }
3547}
3548
Chia-I Wu01ca2372016-05-13 14:37:49 +08003549VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3550 const VkAllocationCallbacks *pAllocator,
3551 VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003552 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003553 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003554 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003555 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003556
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003557 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003558
Dustin Graves080069b2016-04-05 13:48:15 -06003559 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003560 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3561
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003562 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003563 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003564
3565 return result;
3566}
3567
Chia-I Wu01ca2372016-05-13 14:37:49 +08003568VKAPI_ATTR void VKAPI_CALL
3569DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003570 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003571 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003572 assert(my_data != NULL);
3573
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003574 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003575
Dustin Graves080069b2016-04-05 13:48:15 -06003576 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003577 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003578 }
3579}
3580
Chia-I Wu01ca2372016-05-13 14:37:49 +08003581VKAPI_ATTR void VKAPI_CALL
3582GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003583 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003584 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003585 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003586
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003587 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003588
Dustin Graves080069b2016-04-05 13:48:15 -06003589 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003590 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003591 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003592}
3593
Chia-I Wu01ca2372016-05-13 14:37:49 +08003594VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3595 const VkAllocationCallbacks *pAllocator,
3596 VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003597 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003598 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003599 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003600 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003601
Dustin Gravesde628532016-04-21 16:30:17 -06003602 skipCall |=
3603 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003604
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003605 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003606
Dustin Graves080069b2016-04-05 13:48:15 -06003607 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003608 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3609
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003610 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003611 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003612
3613 return result;
3614}
3615
Chia-I Wu01ca2372016-05-13 14:37:49 +08003616VKAPI_ATTR void VKAPI_CALL
3617DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003618 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003619 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003620 assert(my_data != NULL);
3621
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003622 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003623
Dustin Graves080069b2016-04-05 13:48:15 -06003624 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003625 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003626 }
3627}
3628
Chia-I Wu01ca2372016-05-13 14:37:49 +08003629VKAPI_ATTR VkResult VKAPI_CALL
3630ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003631 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3632 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003633 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3634 assert(my_data != NULL);
3635
Dustin Graves20fd66f2016-04-18 18:33:21 -06003636 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003637
Dustin Graves20fd66f2016-04-18 18:33:21 -06003638 if (!skipCall) {
3639 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3640
3641 validate_result(my_data->report_data, "vkResetCommandPool", result);
3642 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003643
3644 return result;
3645}
3646
Chia-I Wu01ca2372016-05-13 14:37:49 +08003647VKAPI_ATTR VkResult VKAPI_CALL
3648AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003649 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003650 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003651 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003652 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003653
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003654 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003655
Dustin Graves080069b2016-04-05 13:48:15 -06003656 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003657 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3658
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003659 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003660 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003661
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003662 return result;
3663}
3664
Chia-I Wu01ca2372016-05-13 14:37:49 +08003665VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3666 uint32_t commandBufferCount,
3667 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003668 bool skip_call = false;
3669 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3670 assert(device_data != nullptr);
3671 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003672
Dustin Gravesc900f572016-05-16 11:07:59 -06003673 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003674
Dustin Gravesc900f572016-05-16 11:07:59 -06003675 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3676 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3677 // validate_array()
3678 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3679 pCommandBuffers, true, true);
3680
3681 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003682 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003683 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003684 }
3685}
3686
Chia-I Wu01ca2372016-05-13 14:37:49 +08003687VKAPI_ATTR VkResult VKAPI_CALL
3688BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003689 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003690 bool skip_call = false;
3691 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3692 assert(device_data != nullptr);
3693 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003694
Dustin Gravesc900f572016-05-16 11:07:59 -06003695 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003696
Dustin Gravesc900f572016-05-16 11:07:59 -06003697 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3698 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3699 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3700 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3701 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3702
3703 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003704 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
3705 pBeginInfo->pInheritanceInfo->pNext, 0, NULL);
3706
3707 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3708 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3709
Dustin Gravesc900f572016-05-16 11:07:59 -06003710 // TODO: This only needs to be validated when the inherited queries feature is enabled
3711 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3712 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3713
3714 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3715 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3716 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3717 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3718 }
3719
3720 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003721 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3722
Dustin Gravesc900f572016-05-16 11:07:59 -06003723 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003724 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003725
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003726 return result;
3727}
3728
Chia-I Wu01ca2372016-05-13 14:37:49 +08003729VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003730 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3731 assert(my_data != NULL);
3732
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003733 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003734
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003735 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003736
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003737 return result;
3738}
3739
Chia-I Wu01ca2372016-05-13 14:37:49 +08003740VKAPI_ATTR VkResult VKAPI_CALL
3741ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003742 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3744 assert(my_data != NULL);
3745
Dustin Graves16d18972016-05-09 17:36:57 -06003746 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003747
Dustin Graves16d18972016-05-09 17:36:57 -06003748 if (!skip_call) {
3749 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3750
3751 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3752 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003753
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003754 return result;
3755}
3756
Chia-I Wu01ca2372016-05-13 14:37:49 +08003757VKAPI_ATTR void VKAPI_CALL
3758CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003759 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003760 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3761 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003762
Dustin Graves29148ff2016-03-23 19:44:00 -06003763 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3764
Dustin Graves080069b2016-04-05 13:48:15 -06003765 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003766 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3767 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003768}
3769
Chia-I Wu01ca2372016-05-13 14:37:49 +08003770VKAPI_ATTR void VKAPI_CALL
3771CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003772 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003773 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003774 assert(my_data != NULL);
3775
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003776 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003777
Dustin Graves080069b2016-04-05 13:48:15 -06003778 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003779 get_dispatch_table(pc_device_table_map, commandBuffer)
3780 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003781 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003782}
3783
Chia-I Wu01ca2372016-05-13 14:37:49 +08003784VKAPI_ATTR void VKAPI_CALL
3785CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003786 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003787 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003788 assert(my_data != NULL);
3789
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003790 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003791
Dustin Graves080069b2016-04-05 13:48:15 -06003792 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003793 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3794 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003795}
3796
Chia-I Wu01ca2372016-05-13 14:37:49 +08003797VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003798 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003799}
3800
Chia-I Wu01ca2372016-05-13 14:37:49 +08003801VKAPI_ATTR void VKAPI_CALL
3802CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003803 get_dispatch_table(pc_device_table_map, commandBuffer)
3804 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003805}
3806
Chia-I Wu01ca2372016-05-13 14:37:49 +08003807VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003808 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003809 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003810 assert(my_data != NULL);
3811
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003812 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003813
Dustin Graves080069b2016-04-05 13:48:15 -06003814 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003815 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3816 }
Cody Northrop12365112015-08-17 11:10:49 -06003817}
3818
Chia-I Wu01ca2372016-05-13 14:37:49 +08003819VKAPI_ATTR void VKAPI_CALL
3820CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003821 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003822}
3823
Chia-I Wu01ca2372016-05-13 14:37:49 +08003824VKAPI_ATTR void VKAPI_CALL
3825CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003826 bool skipCall = false;
3827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3828 assert(my_data != NULL);
3829
3830 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3831
3832 if (!skipCall) {
3833 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3834 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003835}
3836
Chia-I Wu01ca2372016-05-13 14:37:49 +08003837VKAPI_ATTR void VKAPI_CALL
3838CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003839 bool skipCall = false;
3840 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3841 assert(my_data != NULL);
3842
3843 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3844
3845 if (!skipCall) {
3846 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3847 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003848}
3849
Chia-I Wu01ca2372016-05-13 14:37:49 +08003850VKAPI_ATTR void VKAPI_CALL
3851CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003852 bool skipCall = false;
3853 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3854 assert(my_data != NULL);
3855
3856 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3857
3858 if (!skipCall) {
3859 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3860 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003861}
3862
Chia-I Wu01ca2372016-05-13 14:37:49 +08003863VKAPI_ATTR void VKAPI_CALL
3864CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3865 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3866 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003867 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003868 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003869 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003870
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003871 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003872 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003873
Dustin Graves080069b2016-04-05 13:48:15 -06003874 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003875 get_dispatch_table(pc_device_table_map, commandBuffer)
3876 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3877 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003878 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003879}
3880
Chia-I Wu01ca2372016-05-13 14:37:49 +08003881VKAPI_ATTR void VKAPI_CALL
3882CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003883 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003884 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3885 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003886
Dustin Graves29148ff2016-03-23 19:44:00 -06003887 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3888
Dustin Graves080069b2016-04-05 13:48:15 -06003889 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003890 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3891 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003892}
3893
Chia-I Wu01ca2372016-05-13 14:37:49 +08003894VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3895 uint32_t bindingCount, const VkBuffer *pBuffers,
3896 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003897 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003898 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003899 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003900
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003901 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003902
Dustin Graves080069b2016-04-05 13:48:15 -06003903 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003904 get_dispatch_table(pc_device_table_map, commandBuffer)
3905 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003906 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003907}
3908
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003909bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3910 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003911 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003912 // 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 -07003913 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003914 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3915 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003916 return false;
3917 }
3918
3919 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003920 // 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 -07003921 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003922 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3923 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003924 return false;
3925 }
3926
3927 return true;
3928}
3929
Chia-I Wu01ca2372016-05-13 14:37:49 +08003930VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3931 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003932 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003933
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 get_dispatch_table(pc_device_table_map, commandBuffer)
3935 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003936}
3937
Chia-I Wu01ca2372016-05-13 14:37:49 +08003938VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3939 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3940 uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003941 get_dispatch_table(pc_device_table_map, commandBuffer)
3942 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003943}
3944
Chia-I Wu01ca2372016-05-13 14:37:49 +08003945VKAPI_ATTR void VKAPI_CALL
3946CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003947 bool skipCall = false;
3948 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3949 assert(my_data != NULL);
3950
3951 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3952
3953 if (!skipCall) {
3954 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3955 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003956}
3957
Chia-I Wu01ca2372016-05-13 14:37:49 +08003958VKAPI_ATTR void VKAPI_CALL
3959CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003960 bool skipCall = false;
3961 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3962 assert(my_data != NULL);
3963
3964 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3965
3966 if (!skipCall) {
3967 get_dispatch_table(pc_device_table_map, commandBuffer)
3968 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3969 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003970}
3971
Chia-I Wu01ca2372016-05-13 14:37:49 +08003972VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003973 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003974}
3975
Chia-I Wu01ca2372016-05-13 14:37:49 +08003976VKAPI_ATTR void VKAPI_CALL
3977CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003978 bool skipCall = false;
3979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3980 assert(my_data != NULL);
3981
3982 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3983
3984 if (!skipCall) {
3985 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3986 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003987}
3988
Chia-I Wu01ca2372016-05-13 14:37:49 +08003989VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3990 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003991 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003992 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003993 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003994
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003995 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003996
Dustin Graves080069b2016-04-05 13:48:15 -06003997 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003998 get_dispatch_table(pc_device_table_map, commandBuffer)
3999 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004000 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004001}
4002
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004003bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4004 if (pRegions != nullptr) {
4005 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4006 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004007 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4008 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004009 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4010 return false;
4011 }
4012 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4013 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004014 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4015 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004016 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4017 return false;
4018 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004019 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004020
4021 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004022}
4023
Chia-I Wu01ca2372016-05-13 14:37:49 +08004024VKAPI_ATTR void VKAPI_CALL
4025CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4026 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004027 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004029 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004030
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004031 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004032 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004033
Dustin Graves080069b2016-04-05 13:48:15 -06004034 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004035 PreCmdCopyImage(commandBuffer, pRegions);
4036
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004037 get_dispatch_table(pc_device_table_map, commandBuffer)
4038 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004039 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004040}
4041
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004042bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4043 if (pRegions != nullptr) {
4044 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4045 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004046 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4047 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004048 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4049 return false;
4050 }
4051 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4052 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004053 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4054 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004055 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4056 return false;
4057 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004058 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004059
4060 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004061}
4062
Chia-I Wu01ca2372016-05-13 14:37:49 +08004063VKAPI_ATTR void VKAPI_CALL
4064CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4065 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06004066 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004067 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004068 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004069
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004070 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004071 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004072
Dustin Graves080069b2016-04-05 13:48:15 -06004073 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004074 PreCmdBlitImage(commandBuffer, pRegions);
4075
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004076 get_dispatch_table(pc_device_table_map, commandBuffer)
4077 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004078 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004079}
4080
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004081bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4082 if (pRegions != nullptr) {
4083 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4084 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004085 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4086 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004087 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4088 "enumerator");
4089 return false;
4090 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004091 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004092
4093 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004094}
4095
Chia-I Wu01ca2372016-05-13 14:37:49 +08004096VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4097 VkImage dstImage, VkImageLayout dstImageLayout,
4098 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004099 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004100 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004101 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004102
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004103 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004104 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105
Dustin Graves080069b2016-04-05 13:48:15 -06004106 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004107 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4108
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004109 get_dispatch_table(pc_device_table_map, commandBuffer)
4110 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004111 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004112}
4113
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004114bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4115 if (pRegions != nullptr) {
4116 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4117 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004118 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4119 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004120 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4121 "enumerator");
4122 return false;
4123 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004124 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004125
4126 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004127}
4128
Chia-I Wu01ca2372016-05-13 14:37:49 +08004129VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4130 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4131 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004132 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004133 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004134 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004135
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004136 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004137 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004138
Dustin Graves080069b2016-04-05 13:48:15 -06004139 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004140 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4141
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004142 get_dispatch_table(pc_device_table_map, commandBuffer)
4143 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004144 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004145}
4146
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004147VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4148 VkDeviceSize dataSize, const uint32_t *pData) {
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 Lobodzinskibbed4372016-06-09 17:01:19 -06004153 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004154
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004155 if (dstOffset & 3) {
4156 skip_call |=
4157 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4158 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4",
4159 dstOffset);
4160 }
4161
4162 if ((dataSize <= 0) || (dataSize > 65536)) {
4163 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4164 INVALID_USAGE, "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4165 "), must be greater than zero and less than or equal to 65536",
4166 dataSize);
4167 } else if (dataSize & 3) {
4168 skip_call |=
4169 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4170 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4",
4171 dataSize);
4172 }
4173
4174 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004175 get_dispatch_table(pc_device_table_map, commandBuffer)
4176 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004177 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004178}
4179
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004180VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4181 VkDeviceSize size, uint32_t data) {
4182 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004183 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4184 assert(my_data != NULL);
4185
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004186 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004187
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004188 if (dstOffset & 3) {
4189 skip_call |= log_msg(
4190 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, "DL",
4191 "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
4192 }
4193
4194 if (size != VK_WHOLE_SIZE) {
4195 if (size <= 0) {
4196 skip_call |= log_msg(
4197 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4198 "DL", "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
4199 } else if (size & 3) {
4200 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4201 INVALID_USAGE, "DL",
4202 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4203 }
4204 }
4205
4206 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004207 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4208 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004209}
4210
Chia-I Wu01ca2372016-05-13 14:37:49 +08004211VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4212 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4213 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004214 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004215 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004216 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004217
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004218 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004219
Dustin Graves080069b2016-04-05 13:48:15 -06004220 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004221 get_dispatch_table(pc_device_table_map, commandBuffer)
4222 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004224}
4225
Chia-I Wu01ca2372016-05-13 14:37:49 +08004226VKAPI_ATTR void VKAPI_CALL
4227CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4228 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4229 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004230 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004231 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004232 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004233
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004234 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004235 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004236
Dustin Graves080069b2016-04-05 13:48:15 -06004237 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004238 get_dispatch_table(pc_device_table_map, commandBuffer)
4239 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004240 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004241}
4242
Chia-I Wu01ca2372016-05-13 14:37:49 +08004243VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4244 const VkClearAttachment *pAttachments, uint32_t rectCount,
4245 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004246 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004247 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004248 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004249
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004250 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004251
Dustin Graves080069b2016-04-05 13:48:15 -06004252 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004253 get_dispatch_table(pc_device_table_map, commandBuffer)
4254 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004255 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004256}
4257
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004258bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4259 if (pRegions != nullptr) {
4260 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4261 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4262 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004263 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4264 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004265 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4266 return false;
4267 }
4268 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4269 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4270 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004271 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4272 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004273 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4274 return false;
4275 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004276 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004277
4278 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004279}
4280
Chia-I Wu01ca2372016-05-13 14:37:49 +08004281VKAPI_ATTR void VKAPI_CALL
4282CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4283 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004284 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004285 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004286 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004287
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004288 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004289 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004290
Dustin Graves080069b2016-04-05 13:48:15 -06004291 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004292 PreCmdResolveImage(commandBuffer, pRegions);
4293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 get_dispatch_table(pc_device_table_map, commandBuffer)
4295 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004296 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004297}
4298
Chia-I Wu01ca2372016-05-13 14:37:49 +08004299VKAPI_ATTR void VKAPI_CALL
4300CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004301 bool skipCall = false;
4302 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4303 assert(my_data != NULL);
4304
4305 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4306
4307 if (!skipCall) {
4308 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4309 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004310}
4311
Chia-I Wu01ca2372016-05-13 14:37:49 +08004312VKAPI_ATTR void VKAPI_CALL
4313CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004314 bool skipCall = false;
4315 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4316 assert(my_data != NULL);
4317
4318 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4319
4320 if (!skipCall) {
4321 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4322 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004323}
4324
Chia-I Wu01ca2372016-05-13 14:37:49 +08004325VKAPI_ATTR void VKAPI_CALL
4326CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4327 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4328 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4329 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004330 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004331 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004332 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004333
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004334 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004335 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4336 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004337
Dustin Graves080069b2016-04-05 13:48:15 -06004338 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004339 get_dispatch_table(pc_device_table_map, commandBuffer)
4340 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4341 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004342 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004343}
4344
Chia-I Wu01ca2372016-05-13 14:37:49 +08004345VKAPI_ATTR void VKAPI_CALL
4346CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4347 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4348 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4349 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004350 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004351 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004352 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004353
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004354 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004355 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4356 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004357
Dustin Graves080069b2016-04-05 13:48:15 -06004358 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004359 get_dispatch_table(pc_device_table_map, commandBuffer)
4360 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4361 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004362 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004363}
4364
Chia-I Wu01ca2372016-05-13 14:37:49 +08004365VKAPI_ATTR void VKAPI_CALL
4366CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004367 bool skipCall = false;
4368 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4369 assert(my_data != NULL);
4370
4371 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4372
4373 if (!skipCall) {
4374 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4375 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004376}
4377
Chia-I Wu01ca2372016-05-13 14:37:49 +08004378VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004379 bool skipCall = false;
4380 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4381 assert(my_data != NULL);
4382
4383 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4384
4385 if (!skipCall) {
4386 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4387 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004388}
4389
Chia-I Wu01ca2372016-05-13 14:37:49 +08004390VKAPI_ATTR void VKAPI_CALL
4391CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004392 bool skipCall = false;
4393 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4394 assert(my_data != NULL);
4395
4396 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4397
4398 if (!skipCall) {
4399 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4400 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004401}
4402
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004403bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4404 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004405
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004406 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004407
4408 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004409}
4410
Chia-I Wu01ca2372016-05-13 14:37:49 +08004411VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4412 VkQueryPool queryPool, uint32_t query) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004413 bool skipCall = false;
4414 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4415 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004416
Dustin Graves20fd66f2016-04-18 18:33:21 -06004417 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4418
4419 if (!skipCall) {
4420 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4421
4422 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4423 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004424}
4425
Chia-I Wu01ca2372016-05-13 14:37:49 +08004426VKAPI_ATTR void VKAPI_CALL
4427CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4428 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004429 bool skipCall = false;
4430 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4431 assert(my_data != NULL);
4432
4433 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4434 dstOffset, stride, flags);
4435
4436 if (!skipCall) {
4437 get_dispatch_table(pc_device_table_map, commandBuffer)
4438 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4439 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004440}
4441
Chia-I Wu01ca2372016-05-13 14:37:49 +08004442VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4443 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4444 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004445 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004446 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004447 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004448
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004449 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004450
Dustin Graves080069b2016-04-05 13:48:15 -06004451 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004452 get_dispatch_table(pc_device_table_map, commandBuffer)
4453 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004454 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004455}
4456
Chia-I Wu01ca2372016-05-13 14:37:49 +08004457VKAPI_ATTR void VKAPI_CALL
4458CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004459 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004460 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004461 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004462
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004463 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004464
Dustin Graves080069b2016-04-05 13:48:15 -06004465 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004466 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004467 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004468}
4469
Chia-I Wu01ca2372016-05-13 14:37:49 +08004470VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004471 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004472 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4473 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004474
Dustin Graves29148ff2016-03-23 19:44:00 -06004475 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4476
Dustin Graves080069b2016-04-05 13:48:15 -06004477 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004478 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4479 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004480}
4481
Chia-I Wu01ca2372016-05-13 14:37:49 +08004482VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004483 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004484}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004485
Chia-I Wu01ca2372016-05-13 14:37:49 +08004486VKAPI_ATTR void VKAPI_CALL
4487CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004488 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004489 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004490 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004491
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004492 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004493
Dustin Graves080069b2016-04-05 13:48:15 -06004494 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004495 get_dispatch_table(pc_device_table_map, commandBuffer)
4496 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004497 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004498}
4499
Chia-I Wub02600c2016-05-20 07:11:22 +08004500VKAPI_ATTR VkResult VKAPI_CALL
4501EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4502 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4503}
4504
4505VKAPI_ATTR VkResult VKAPI_CALL
4506EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
4507 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4508}
4509
4510VKAPI_ATTR VkResult VKAPI_CALL
4511EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
4512 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4513 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4514
4515 return VK_ERROR_LAYER_NOT_PRESENT;
4516}
4517
Chia-I Wu01ca2372016-05-13 14:37:49 +08004518VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4519 const char *pLayerName, uint32_t *pCount,
4520 VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004521 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004522 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004523 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004524
4525 assert(physicalDevice);
4526
4527 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4528 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004529}
4530
Chia-I Wuf9b01382016-05-16 07:37:41 +08004531static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004532intercept_core_instance_command(const char *name);
4533
4534static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004535intercept_core_device_command(const char *name);
4536
Chia-I Wu01ca2372016-05-13 14:37:49 +08004537VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08004538 assert(device);
4539
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004540 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4541
Dustin Graves080069b2016-04-05 13:48:15 -06004542 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004543 return NULL;
4544 }
4545
Chia-I Wuf9b01382016-05-16 07:37:41 +08004546 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
4547 if (proc)
4548 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004549
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004550 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004551 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004552 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004553}
4554
Chia-I Wu01ca2372016-05-13 14:37:49 +08004555VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08004556 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08004557 if (!proc)
4558 proc = intercept_core_device_command(funcName);
Chia-I Wu617f2a42016-05-16 07:41:17 +08004559 if (proc)
4560 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004561
Chia-I Wu617f2a42016-05-16 07:41:17 +08004562 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004563
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004564 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004565
Chia-I Wu617f2a42016-05-16 07:41:17 +08004566 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
4567 if (proc)
4568 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004569
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004570 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004571 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004572 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004573}
Chia-I Wu99f701c2016-05-13 14:06:08 +08004574
Chia-I Wuf9b01382016-05-16 07:37:41 +08004575static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004576intercept_core_instance_command(const char *name) {
4577 static const struct {
4578 const char *name;
4579 PFN_vkVoidFunction proc;
4580 } core_instance_commands[] = {
4581 { "vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr) },
4582 { "vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance) },
4583 { "vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance) },
4584 { "vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice) },
4585 { "vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices) },
4586 { "vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties) },
4587 { "vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures) },
4588 { "vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties) },
4589 { "vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties) },
4590 { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties) },
4591 { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties) },
4592 { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties) },
Chia-I Wub02600c2016-05-20 07:11:22 +08004593 { "vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties) },
4594 { "vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties) },
4595 { "vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08004596 { "vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties) },
4597 };
4598
4599 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
4600 if (!strcmp(core_instance_commands[i].name, name))
4601 return core_instance_commands[i].proc;
4602 }
4603
4604 return nullptr;
4605}
4606
4607static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004608intercept_core_device_command(const char *name) {
4609 static const struct {
4610 const char *name;
4611 PFN_vkVoidFunction proc;
4612 } core_device_commands[] = {
4613 { "vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr) },
4614 { "vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice) },
4615 { "vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue) },
4616 { "vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit) },
4617 { "vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle) },
4618 { "vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle) },
4619 { "vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory) },
4620 { "vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory) },
4621 { "vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory) },
4622 { "vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory) },
4623 { "vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges) },
4624 { "vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges) },
4625 { "vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment) },
4626 { "vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory) },
4627 { "vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory) },
4628 { "vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence) },
4629 { "vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence) },
4630 { "vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences) },
4631 { "vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus) },
4632 { "vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences) },
4633 { "vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore) },
4634 { "vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore) },
4635 { "vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent) },
4636 { "vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent) },
4637 { "vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus) },
4638 { "vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent) },
4639 { "vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent) },
4640 { "vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool) },
4641 { "vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool) },
4642 { "vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults) },
4643 { "vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer) },
4644 { "vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer) },
4645 { "vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView) },
4646 { "vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView) },
4647 { "vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage) },
4648 { "vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage) },
4649 { "vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout) },
4650 { "vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView) },
4651 { "vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView) },
4652 { "vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule) },
4653 { "vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule) },
4654 { "vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache) },
4655 { "vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache) },
4656 { "vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData) },
4657 { "vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches) },
4658 { "vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines) },
4659 { "vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines) },
4660 { "vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline) },
4661 { "vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout) },
4662 { "vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout) },
4663 { "vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler) },
4664 { "vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler) },
4665 { "vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout) },
4666 { "vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout) },
4667 { "vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool) },
4668 { "vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool) },
4669 { "vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool) },
4670 { "vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets) },
4671 { "vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets) },
4672 { "vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets) },
4673 { "vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport) },
4674 { "vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor) },
4675 { "vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth) },
4676 { "vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias) },
4677 { "vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants) },
4678 { "vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds) },
4679 { "vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask) },
4680 { "vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask) },
4681 { "vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference) },
4682 { "vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers) },
4683 { "vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers) },
4684 { "vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer) },
4685 { "vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer) },
4686 { "vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer) },
4687 { "vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline) },
4688 { "vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets) },
4689 { "vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers) },
4690 { "vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer) },
4691 { "vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw) },
4692 { "vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed) },
4693 { "vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect) },
4694 { "vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect) },
4695 { "vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch) },
4696 { "vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect) },
4697 { "vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer) },
4698 { "vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage) },
4699 { "vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage) },
4700 { "vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage) },
4701 { "vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer) },
4702 { "vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer) },
4703 { "vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer) },
4704 { "vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage) },
4705 { "vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage) },
4706 { "vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent) },
4707 { "vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent) },
4708 { "vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents) },
4709 { "vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier) },
4710 { "vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery) },
4711 { "vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery) },
4712 { "vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool) },
4713 { "vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp) },
4714 { "vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults) },
4715 { "vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer) },
4716 { "vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer) },
4717 { "vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass) },
4718 { "vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass) },
4719 { "vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity) },
4720 { "vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool) },
4721 { "vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool) },
4722 { "vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool) },
4723 { "vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass) },
4724 { "vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass) },
4725 };
4726
4727 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
4728 if (!strcmp(core_device_commands[i].name, name))
4729 return core_device_commands[i].proc;
4730 }
4731
4732 return nullptr;
4733}
4734
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004735} // namespace parameter_validation
4736
4737// vk_layer_logging.h expects these to be defined
4738
4739VKAPI_ATTR VkResult VKAPI_CALL
4740vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4741 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004742 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004743}
4744
4745VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
4746 VkDebugReportCallbackEXT msgCallback,
4747 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004748 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004749}
4750
4751VKAPI_ATTR void VKAPI_CALL
4752vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
4753 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004754 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004755}
4756
4757// loader-layer interface v0
4758
Chia-I Wu99f701c2016-05-13 14:06:08 +08004759VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4760vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004761 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004762}
4763
4764VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4765vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004766 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004767}
4768
4769VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4770vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004771 // the layer command handles VK_NULL_HANDLE just fine internally
4772 assert(physicalDevice == VK_NULL_HANDLE);
4773 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004774}
4775
4776VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4777 const char *pLayerName, uint32_t *pCount,
4778 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004779 // the layer command handles VK_NULL_HANDLE just fine internally
4780 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08004781 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004782}
4783
4784VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004785 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004786}
4787
4788VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004789 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004790}