blob: 4be503168a9af4bbe2a1b78ec1ef8d1b6abfe95a [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;
70
Ian Elliotted6b5ac2016-04-28 09:08:13 -060071 layer_data() : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr){};
Cody Northrop55443ef2015-09-28 15:09:32 -060072};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050073
Jon Ashburn5484e0c2016-03-08 17:48:44 -070074static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060075static device_table_map pc_device_table_map;
76static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060077
Jeremy Hayes99a96322015-06-26 12:48:09 -060078// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070079debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060080 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060081 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060082#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060083 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 -060084#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060085 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060086
87 return data->report_data;
88}
89
90// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070091debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060092 dispatch_key key = get_dispatch_key(object);
93 layer_data *data = get_my_data_ptr(key, layer_data_map);
94#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060095 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 -060096#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060097 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060098 return data->report_data;
99}
100
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600101static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600103 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600104}
105
Chia-I Wu01ca2372016-05-13 14:37:49 +0800106VKAPI_ATTR VkResult VKAPI_CALL
107CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
108 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700109 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700110 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600111
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700112 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700113 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600114 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600115 }
116
117 return result;
118}
119
Chia-I Wu01ca2372016-05-13 14:37:49 +0800120VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance,
121 VkDebugReportCallbackEXT msgCallback,
122 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700123 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700124 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600125
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700126 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700127 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600128}
129
Chia-I Wu01ca2372016-05-13 14:37:49 +0800130VKAPI_ATTR void VKAPI_CALL
131DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
132 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700133 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
134 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700135}
136
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700137static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600138
Chia-I Wu3384db82016-05-16 07:30:58 +0800139static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600140 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800141};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700142
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700143static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600144 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700145 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
146 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
147 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
148 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
149 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 -0700150 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700151 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600152 return false;
153 }
154
155 return true;
156}
157
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700158static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
159 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600160 return "unrecognized enumerator";
161 }
162
163 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600165 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
166 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
169 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700170 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600171 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600180 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600183 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600186 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
187 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600189 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
190 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700191 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600192 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
193 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700194 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800195 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600196 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800198 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600199 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700200 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700201 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
202 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600203
204 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700205 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600206 enumeratorString += string;
207
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700208 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600209 enumeratorString += '|';
210 }
211 }
212
213 return enumeratorString;
214}
215
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
217 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
218 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
219 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
220 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
221 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600222 return false;
223 }
224
225 return true;
226}
227
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700228static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
229 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600230 return "unrecognized enumerator";
231 }
232
233 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700234 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600235 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
236 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600238 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600239 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
242 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600244 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
245 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700246 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600247 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
248 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700249 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800250 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600251 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700252 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600253 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
254 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700255 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800256 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600257 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600258
259 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700260 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600261 enumeratorString += string;
262
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700263 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600264 enumeratorString += '|';
265 }
266 }
267
268 return enumeratorString;
269}
270
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
272 VkQueueFlagBits allFlags =
273 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
274 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600275 return false;
276 }
277
278 return true;
279}
280
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
282 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600283 return "unrecognized enumerator";
284 }
285
286 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700287 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800288 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600289 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700290 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600291 strings.push_back("VK_QUEUE_COMPUTE_BIT");
292 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700293 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800294 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600295 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700296 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600297 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
298 }
299
300 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700301 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600302 enumeratorString += string;
303
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700304 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 enumeratorString += '|';
306 }
307 }
308
309 return enumeratorString;
310}
311
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
313 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
314 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
315 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
316 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600317 return false;
318 }
319
320 return true;
321}
322
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
324 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600325 return "unrecognized enumerator";
326 }
327
328 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700329 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600330 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
331 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800333 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600334 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700335 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600336 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
337 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700338 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800339 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600340 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700341 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800342 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600343 }
344
345 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700346 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600347 enumeratorString += string;
348
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700349 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600350 enumeratorString += '|';
351 }
352 }
353
354 return enumeratorString;
355}
356
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700358 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700359 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600360 return false;
361 }
362
363 return true;
364}
365
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700366static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
367 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600368 return "unrecognized enumerator";
369 }
370
371 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700372 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800373 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600374 }
375
376 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700377 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600378 enumeratorString += string;
379
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700380 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600381 enumeratorString += '|';
382 }
383 }
384
385 return enumeratorString;
386}
387
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700388static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
389 VkSparseImageFormatFlagBits allFlags =
390 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
391 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
392 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600393 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600394 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600395
396 return true;
397}
398
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700399static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
400 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600401 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600402 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600403
404 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700405 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800406 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600407 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700408 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800409 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600410 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700411 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800412 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600413 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600414
415 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700416 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600417 enumeratorString += string;
418
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700419 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600420 enumeratorString += '|';
421 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600422 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600423
424 return enumeratorString;
425}
426
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700428 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700429 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600430 return false;
431 }
432
433 return true;
434}
435
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700436static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
437 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600438 return "unrecognized enumerator";
439 }
440
441 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700442 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600443 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
444 }
445
446 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700447 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600448 enumeratorString += string;
449
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700450 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600451 enumeratorString += '|';
452 }
453 }
454
455 return enumeratorString;
456}
457
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
459 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
460 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
461 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
462 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
463 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600464 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
465 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
466 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700467 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600468 return false;
469 }
470
471 return true;
472}
473
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
475 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 return "unrecognized enumerator";
477 }
478
479 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700481 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600482 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700484 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700486 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700487 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600488 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700499 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700501 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700502 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600503 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700504 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700505 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600506 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700507 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700508 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600509 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700510 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700511 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600512 }
513
514 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700515 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600516 enumeratorString += string;
517
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700518 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600519 enumeratorString += '|';
520 }
521 }
522
523 return enumeratorString;
524}
525
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
527 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
528 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
529 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600530 return false;
531 }
532
533 return true;
534}
535
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
537 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600538 return "unrecognized enumerator";
539 }
540
541 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700542 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600543 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
544 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700545 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600546 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
547 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700548 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600549 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
550 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700551 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600552 strings.push_back("VK_QUERY_RESULT_64_BIT");
553 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600554
555 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700556 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600557 enumeratorString += string;
558
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700559 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600560 enumeratorString += '|';
561 }
562 }
563
564 return enumeratorString;
565}
566
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700567static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
568 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
569 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
570 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
571 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
572 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600573 return false;
574 }
575
576 return true;
577}
578
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700579static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
580 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600581 return "unrecognized enumerator";
582 }
583
584 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700585 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600586 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
587 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600589 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
590 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700591 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600592 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
593 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600595 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
596 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700597 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
599 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700600 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800601 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700603 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600604 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
605 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700606 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800607 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700609 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600610 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
611 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600612
613 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700614 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600615 enumeratorString += string;
616
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700617 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600618 enumeratorString += '|';
619 }
620 }
621
622 return enumeratorString;
623}
624
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
626 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
627 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
628 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600629 return false;
630 }
631
632 return true;
633}
634
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700635static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
636 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 return "unrecognized enumerator";
638 }
639
640 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700641 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600642 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
643 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700644 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600645 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
646 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700647 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600648 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600649 }
650
651 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700652 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600653 enumeratorString += string;
654
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700655 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600656 enumeratorString += '|';
657 }
658 }
659
660 return enumeratorString;
661}
662
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700663static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
664 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
665 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
666 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
667 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600668 return false;
669 }
670
671 return true;
672}
673
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
675 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600676 return "unrecognized enumerator";
677 }
678
679 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700680 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600681 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
682 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700683 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600684 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
685 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700686 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600687 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
688 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700689 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600690 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
691 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700692 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600693 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600694 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600695
696 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700697 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600698 enumeratorString += string;
699
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700700 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600701 enumeratorString += '|';
702 }
703 }
704
705 return enumeratorString;
706}
707
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
709 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
710 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
711 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600712 return false;
713 }
714
715 return true;
716}
717
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
719 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 return "unrecognized enumerator";
721 }
722
723 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700724 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800725 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600726 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700727 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800728 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600729 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700730 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800731 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600732 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700733 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800734 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600735 }
736
737 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700738 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600739 enumeratorString += string;
740
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700741 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600742 enumeratorString += '|';
743 }
744 }
745
746 return enumeratorString;
747}
748
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
750 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
751 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
752 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600753 return false;
754 }
755
756 return true;
757}
758
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700759static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
760 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600761 return "unrecognized enumerator";
762 }
763
764 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700765 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600766 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
767 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700768 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600769 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
770 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700771 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600772 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600773 }
774
775 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600777 enumeratorString += string;
778
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700779 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600780 enumeratorString += '|';
781 }
782 }
783
784 return enumeratorString;
785}
786
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700787static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
788 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
789 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
790 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
791 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600792 return false;
793 }
794
795 return true;
796}
797
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
799 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600800 return "unrecognized enumerator";
801 }
802
803 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700804 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600805 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600808 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600809 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700810 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600811 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
812 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700813 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600814 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
815 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700816 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600817 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600818 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700819 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600820 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600821 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700822 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600823 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600824 }
825
826 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700827 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600828 enumeratorString += string;
829
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700830 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600831 enumeratorString += '|';
832 }
833 }
834
835 return enumeratorString;
836}
837
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800839 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700840 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
841 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
842 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
843 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
844 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
845 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 -0700846 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700847 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600848 return false;
849 }
850
851 return true;
852}
853
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
855 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 return "unrecognized enumerator";
857 }
858
859 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800861 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
862 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800864 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700866 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600867 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600868 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600870 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600873 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700876 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600882 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600885 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700897 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600898 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700899 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600900 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
901 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700902 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600903 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
904 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700905 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600906 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
907 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600909 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600910 }
911
912 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700913 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600914 enumeratorString += string;
915
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700916 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600917 enumeratorString += '|';
918 }
919 }
920
921 return enumeratorString;
922}
923
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800925 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700926 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
927 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
928 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
929 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
930 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 +0800931
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700932 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600933 return false;
934 }
935
936 return true;
937}
938
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700939static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
940 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600941 return "unrecognized enumerator";
942 }
943
944 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700945 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800946 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600947 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800949 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600950 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800952 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600953 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600983 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700984 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800985 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600986 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700987 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800988 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600989 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700990 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800991 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600992 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700993 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800994 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600995 }
996
997 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700998 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600999 enumeratorString += string;
1000
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001001 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001002 enumeratorString += '|';
1003 }
1004 }
1005
1006 return enumeratorString;
1007}
1008
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1010 VkCommandPoolCreateFlagBits allFlags =
1011 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1012 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001013 return false;
1014 }
1015
1016 return true;
1017}
1018
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001019static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1020 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001021 return "unrecognized enumerator";
1022 }
1023
1024 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001025 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001026 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001027 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001028 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001029 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001030 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001031
1032 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001033 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001034 enumeratorString += string;
1035
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001036 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001037 enumeratorString += '|';
1038 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001039 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001040
1041 return enumeratorString;
1042}
1043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001045 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001046 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001047 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001048 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001049
1050 return true;
1051}
1052
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001053static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1054 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001055 return "unrecognized enumerator";
1056 }
1057
1058 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001059 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001060 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001061 }
1062
1063 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001064 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001065 enumeratorString += string;
1066
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001067 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001068 enumeratorString += '|';
1069 }
1070 }
1071
1072 return enumeratorString;
1073}
1074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001075static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1076 VkCommandBufferUsageFlags allFlags =
1077 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1078 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1079 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001080 return false;
1081 }
1082
1083 return true;
1084}
1085
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001086static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1087 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 return "unrecognized enumerator";
1089 }
1090
1091 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001092 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001093 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001094 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001095 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001096 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001097 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001098 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001099 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001100 }
1101
1102 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001103 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001104 enumeratorString += string;
1105
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001106 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 enumeratorString += '|';
1108 }
1109 }
1110
1111 return enumeratorString;
1112}
1113
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001115 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001116 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001117 return false;
1118 }
1119
1120 return true;
1121}
1122
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001123static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1124 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001125 return "unrecognized enumerator";
1126 }
1127
1128 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001129 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001130 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001131 }
1132
1133 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001134 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001135 enumeratorString += string;
1136
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001137 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001138 enumeratorString += '|';
1139 }
1140 }
1141
1142 return enumeratorString;
1143}
1144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1146 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1147 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1148 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001149 return false;
1150 }
1151
1152 return true;
1153}
1154
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1156 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001157 return "unrecognized enumerator";
1158 }
1159
1160 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001161 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001162 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1163 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001164 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001165 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1166 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001167 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001168 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1169 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001170 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001171 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1172 }
1173
1174 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001175 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001176 enumeratorString += string;
1177
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001178 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001179 enumeratorString += '|';
1180 }
1181 }
1182
1183 return enumeratorString;
1184}
1185
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001187 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001188 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001189 return false;
1190 }
1191
1192 return true;
1193}
1194
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001195static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1196 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001197 return "unrecognized enumerator";
1198 }
1199
1200 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001201 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001202 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001203 }
1204
1205 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001206 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001207 enumeratorString += string;
1208
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001209 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001210 enumeratorString += '|';
1211 }
1212 }
1213
1214 return enumeratorString;
1215}
1216
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001217static const int MaxParamCheckerStringLength = 256;
1218
Dustin Graves080069b2016-04-05 13:48:15 -06001219static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1220 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001221 assert(apiName != nullptr);
1222 assert(stringName != nullptr);
1223 assert(validateString != nullptr);
1224
Dustin Graves080069b2016-04-05 13:48:15 -06001225 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001226
1227 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1228
1229 if (result == VK_STRING_ERROR_NONE) {
1230 return skipCall;
1231 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001232 skipCall =
1233 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1234 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001235 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001236 skipCall =
1237 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1238 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001239 }
1240 return skipCall;
1241}
1242
Dustin Gravesde628532016-04-21 16:30:17 -06001243static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1244 uint32_t index) {
1245 assert(device_data != nullptr);
1246 debug_report_data *report_data = device_data->report_data;
1247 bool skip_call = false;
1248
1249 if (index == VK_QUEUE_FAMILY_IGNORED) {
1250 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1251 "PARAMCHECK", "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
1252 } else {
1253 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1254 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1255 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1256 "PARAMCHECK", "%s: %s (%d) must be one of the indices specified when the device was created, via "
1257 "the VkDeviceQueueCreateInfo structure.",
1258 function_name, parameter_name, index);
1259 return false;
1260 }
1261 }
1262
1263 return skip_call;
1264}
1265
1266static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1267 const uint32_t count, const uint32_t *indices) {
1268 assert(device_data != nullptr);
1269 debug_report_data *report_data = device_data->report_data;
1270 bool skip_call = false;
1271
1272 if (indices != nullptr) {
1273 for (uint32_t i = 0; i < count; i++) {
1274 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1275 skip_call |=
1276 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1277 "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
1278 } else {
1279 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1280 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1281 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1282 "PARAMCHECK", "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1283 "created, via the VkDeviceQueueCreateInfo structure.",
1284 function_name, parameter_name, i, indices[i]);
1285 return false;
1286 }
1287 }
1288 }
1289 }
1290
1291 return skip_call;
1292}
1293
Chia-I Wu01ca2372016-05-13 14:37:49 +08001294VKAPI_ATTR VkResult VKAPI_CALL
1295CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001296 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001297
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001298 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001299 assert(chain_info != nullptr);
1300 assert(chain_info->u.pLayerInfo != nullptr);
1301
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001302 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1303 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001304 if (fpCreateInstance == NULL) {
1305 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001306 }
1307
Dustin Graves842621d2016-03-03 14:17:08 -07001308 // Advance the link info for the next element on the chain
1309 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1310
1311 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001312
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001313 if (result == VK_SUCCESS) {
1314 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1315 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001316
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001317 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001318
Chia-I Wua570b7c2016-05-16 07:48:14 +08001319 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001320 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1321 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001322
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001323 // Look for one or more debug report create info structures
1324 // and setup a callback(s) for each one found.
1325 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1326 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1327 if (my_instance_data->num_tmp_callbacks > 0) {
1328 // Setup the temporary callback(s) here to catch early issues:
1329 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1330 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1331 // Failure of setting up one or more of the callback.
1332 // Therefore, clean up and don't use those callbacks:
1333 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1334 my_instance_data->num_tmp_callbacks = 0;
1335 }
1336 }
1337 }
1338
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001339 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001340
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001341 // Ordinarily we'd check these before calling down the chain, but none of the layer
1342 // support is in place until now, if we survive we can report the issue now.
1343 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001344
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001345 if (pCreateInfo->pApplicationInfo) {
1346 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1347 validate_string(my_instance_data->report_data, "vkCreateInstance",
1348 "pCreateInfo->VkApplicationInfo->pApplicationName",
1349 pCreateInfo->pApplicationInfo->pApplicationName);
1350 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001351
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001352 if (pCreateInfo->pApplicationInfo->pEngineName) {
1353 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1354 pCreateInfo->pApplicationInfo->pEngineName);
1355 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001356 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001357
1358 // Disable the tmp callbacks:
1359 if (my_instance_data->num_tmp_callbacks > 0) {
1360 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1361 my_instance_data->tmp_callbacks);
1362 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001363 }
1364
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001365 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001366}
1367
Chia-I Wu01ca2372016-05-13 14:37:49 +08001368VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001369 // Grab the key before the instance is destroyed.
1370 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001371 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001372 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001373 assert(my_data != NULL);
1374
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001375 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1376 bool callback_setup = false;
1377 if (my_data->num_tmp_callbacks > 0) {
1378 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1379 my_data->tmp_callbacks)) {
1380 callback_setup = true;
1381 }
1382 }
1383
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001384 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001385
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001386 // Disable and cleanup the temporary callback(s):
1387 if (callback_setup) {
1388 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1389 }
1390 if (my_data->num_tmp_callbacks > 0) {
1391 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1392 my_data->num_tmp_callbacks = 0;
1393 }
1394
Dustin Graves080069b2016-04-05 13:48:15 -06001395 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001396 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001397 pTable->DestroyInstance(instance, pAllocator);
1398
1399 // Clean up logging callback, if any
1400 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001401 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1402 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001403 my_data->logging_callback.pop_back();
1404 }
1405
1406 layer_debug_report_destroy_instance(mid(instance));
1407 layer_data_map.erase(pTable);
1408
1409 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001410 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001411 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001412}
1413
Chia-I Wu01ca2372016-05-13 14:37:49 +08001414VKAPI_ATTR VkResult VKAPI_CALL
1415EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001416 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001417 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001419 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001420
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001421 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001422
Dustin Graves080069b2016-04-05 13:48:15 -06001423 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001424 result = get_dispatch_table(pc_instance_table_map, instance)
1425 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001426
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001427 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001428 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001429
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001430 return result;
1431}
1432
Chia-I Wu01ca2372016-05-13 14:37:49 +08001433VKAPI_ATTR void VKAPI_CALL
1434GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001435 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001436 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001437 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001438
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001439 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001440
Dustin Graves080069b2016-04-05 13:48:15 -06001441 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001442 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001443 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001444}
1445
Chia-I Wu01ca2372016-05-13 14:37:49 +08001446VKAPI_ATTR void VKAPI_CALL
1447GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001448 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001449 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001451
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001452 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453
Dustin Graves080069b2016-04-05 13:48:15 -06001454 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001455 get_dispatch_table(pc_instance_table_map, physicalDevice)
1456 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001457 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001458}
1459
Chia-I Wu01ca2372016-05-13 14:37:49 +08001460VKAPI_ATTR VkResult VKAPI_CALL
1461GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1462 VkImageUsageFlags usage, VkImageCreateFlags flags,
1463 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001464 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001465 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001466 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001467 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001468
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001469 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001470 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471
Dustin Graves080069b2016-04-05 13:48:15 -06001472 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001473 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1474 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1475 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001476
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001477 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001478 }
Chia-I Wu17241042015-10-31 00:31:16 +08001479
1480 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001481}
1482
Chia-I Wu01ca2372016-05-13 14:37:49 +08001483VKAPI_ATTR void VKAPI_CALL
1484GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001485 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001488
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001489 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490
Dustin Graves080069b2016-04-05 13:48:15 -06001491 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001492 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001494}
1495
Chia-I Wu01ca2372016-05-13 14:37:49 +08001496VKAPI_ATTR void VKAPI_CALL
1497GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1498 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001499 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001500 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001502
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001503 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001504 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001505
Dustin Graves080069b2016-04-05 13:48:15 -06001506 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001507 get_dispatch_table(pc_instance_table_map, physicalDevice)
1508 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001509 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001510}
1511
Chia-I Wu01ca2372016-05-13 14:37:49 +08001512VKAPI_ATTR void VKAPI_CALL
1513GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001514 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001515 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001517
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001518 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001519
Dustin Graves080069b2016-04-05 13:48:15 -06001520 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001521 get_dispatch_table(pc_instance_table_map, physicalDevice)
1522 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001523 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001524}
1525
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001526void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1527 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001528 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001529
1530 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1531 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1532 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001533 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1534 INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001535 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1536 "structure.",
1537 i);
1538 } else {
1539 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001540 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001541
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001542 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1543 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1544 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1545 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001546 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1547 __LINE__, INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001548 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1549 "between 0 and 1. Actual value is %f",
1550 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1551 }
1552 }
1553 }
1554
1555 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1556 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001557 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1558 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001559 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1560 "of queue families.",
1561 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001562 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1563 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1564 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001565 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1566 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001567 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1568 "queues for the given family index.",
1569 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001570 }
Michael Lentine774704f2016-01-27 13:36:46 -06001571 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001572 }
1573}
1574
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001575void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001576 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001577
1578 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1579 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1580 my_device_data->queueFamilyIndexMap.insert(
1581 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1582 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001583 }
1584}
1585
Chia-I Wu01ca2372016-05-13 14:37:49 +08001586VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice,
1587 const VkDeviceCreateInfo *pCreateInfo,
1588 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001589 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001590 * NOTE: We do not validate physicalDevice or any dispatchable
1591 * object as the first parameter. We couldn't get here if it was wrong!
1592 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001593
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001594 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001595 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001596 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001597 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001598
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001599 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001600
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001601 if (pCreateInfo != NULL) {
1602 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001603 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001604 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1605 pCreateInfo->ppEnabledLayerNames[i]);
1606 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001607 }
Michael Lentine774704f2016-01-27 13:36:46 -06001608
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001609 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001610 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001611 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1612 pCreateInfo->ppEnabledExtensionNames[i]);
1613 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001614 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001615 }
1616
Dustin Graves080069b2016-04-05 13:48:15 -06001617 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001618 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001619 assert(chain_info != nullptr);
1620 assert(chain_info->u.pLayerInfo != nullptr);
1621
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001622 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1623 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001624 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001625 if (fpCreateDevice == NULL) {
1626 return VK_ERROR_INITIALIZATION_FAILED;
1627 }
1628
1629 // Advance the link info for the next element on the chain
1630 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1631
1632 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001633
1634 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1635
1636 if (result == VK_SUCCESS) {
1637 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1638 assert(my_device_data != nullptr);
1639
1640 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1641 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1642
1643 uint32_t count;
1644 get_dispatch_table(pc_instance_table_map, physicalDevice)
1645 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1646 std::vector<VkQueueFamilyProperties> properties(count);
1647 get_dispatch_table(pc_instance_table_map, physicalDevice)
1648 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1649
1650 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1651 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001652 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001653 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001654
Jeremy Hayes99a96322015-06-26 12:48:09 -06001655 return result;
1656}
1657
Chia-I Wu01ca2372016-05-13 14:37:49 +08001658VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001659 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001660 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001661 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1662 assert(my_data != NULL);
1663
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001664 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001665
Dustin Graves080069b2016-04-05 13:48:15 -06001666 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001667 layer_debug_report_destroy_device(device);
1668
Jeremy Hayes99a96322015-06-26 12:48:09 -06001669#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001670 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001671#endif
1672
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001673 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001674 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001675 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001676 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001677}
1678
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001679bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001680 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001681 assert(my_device_data != nullptr);
1682
Dustin Gravesde628532016-04-21 16:30:17 -06001683 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001684
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001685 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001686 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001687 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1688 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001689 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1690 "was created.",
1691 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001692 return false;
1693 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001694
Michael Lentinebdf744f2016-01-27 15:43:43 -06001695 return true;
1696}
1697
Chia-I Wu01ca2372016-05-13 14:37:49 +08001698VKAPI_ATTR void VKAPI_CALL
1699GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001700 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001701 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001702 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001703
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001704 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001705
Dustin Graves080069b2016-04-05 13:48:15 -06001706 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001707 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1708
1709 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001710 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001711}
1712
Chia-I Wu01ca2372016-05-13 14:37:49 +08001713VKAPI_ATTR VkResult VKAPI_CALL
1714QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001715 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001716 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001717 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001718 assert(my_data != NULL);
1719
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001720 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001721
Dustin Graves080069b2016-04-05 13:48:15 -06001722 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001723 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1724
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001725 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001726 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001727
Jeremy Hayes99a96322015-06-26 12:48:09 -06001728 return result;
1729}
1730
Chia-I Wu01ca2372016-05-13 14:37:49 +08001731VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1733 assert(my_data != NULL);
1734
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001735 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001736
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001737 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001738
1739 return result;
1740}
1741
Chia-I Wu01ca2372016-05-13 14:37:49 +08001742VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1744 assert(my_data != NULL);
1745
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001746 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001747
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001748 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001749
1750 return result;
1751}
1752
Chia-I Wu01ca2372016-05-13 14:37:49 +08001753VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001754 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1755 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001756 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001757 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001758 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001759
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001760 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001761
Dustin Graves080069b2016-04-05 13:48:15 -06001762 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001763 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1764
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001765 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001766 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001767
1768 return result;
1769}
1770
Chia-I Wu01ca2372016-05-13 14:37:49 +08001771VKAPI_ATTR void VKAPI_CALL
1772FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001773 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001774 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001775 assert(my_data != NULL);
1776
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001777 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001778
Dustin Graves080069b2016-04-05 13:48:15 -06001779 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001780 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001781 }
1782}
1783
Chia-I Wu01ca2372016-05-13 14:37:49 +08001784VKAPI_ATTR VkResult VKAPI_CALL
1785MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001786 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001787 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001788 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001791 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001792
Dustin Graves080069b2016-04-05 13:48:15 -06001793 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001794 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1795
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001796 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001797 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001798
1799 return result;
1800}
1801
Chia-I Wu01ca2372016-05-13 14:37:49 +08001802VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001803 bool skipCall = false;
1804 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1805 assert(my_data != NULL);
1806
1807 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1808
1809 if (!skipCall) {
1810 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1811 }
1812}
1813
Chia-I Wu01ca2372016-05-13 14:37:49 +08001814VKAPI_ATTR VkResult VKAPI_CALL
1815FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001816 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001817 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001818 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001819 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001820
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001821 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001822
Dustin Graves080069b2016-04-05 13:48:15 -06001823 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001824 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1825
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001826 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001827 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001828
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001829 return result;
1830}
1831
Chia-I Wu01ca2372016-05-13 14:37:49 +08001832VKAPI_ATTR VkResult VKAPI_CALL
1833InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001834 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001835 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001836 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001837 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001838
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001839 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001840
Dustin Graves080069b2016-04-05 13:48:15 -06001841 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001842 result =
1843 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001844
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001845 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001846 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001847
Tony Barbourb1250542015-04-16 19:23:13 -06001848 return result;
1849}
1850
Chia-I Wu01ca2372016-05-13 14:37:49 +08001851VKAPI_ATTR void VKAPI_CALL
1852GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001853 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001854 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001855 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001856
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001857 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001858
Dustin Graves080069b2016-04-05 13:48:15 -06001859 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001860 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001861 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001862}
1863
Chia-I Wu01ca2372016-05-13 14:37:49 +08001864VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1865 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001866 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1867 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001868 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1869 assert(my_data != NULL);
1870
Dustin Graves20fd66f2016-04-18 18:33:21 -06001871 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001872
Dustin Graves20fd66f2016-04-18 18:33:21 -06001873 if (!skipCall) {
1874 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1875
1876 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1877 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001878
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001879 return result;
1880}
1881
Chia-I Wu01ca2372016-05-13 14:37:49 +08001882VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1883 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001884 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1885 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001886 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1887 assert(my_data != NULL);
1888
Dustin Graves20fd66f2016-04-18 18:33:21 -06001889 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001890
Dustin Graves20fd66f2016-04-18 18:33:21 -06001891 if (!skipCall) {
1892 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1893
1894 validate_result(my_data->report_data, "vkBindImageMemory", result);
1895 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001896
1897 return result;
1898}
1899
Chia-I Wu01ca2372016-05-13 14:37:49 +08001900VKAPI_ATTR void VKAPI_CALL
1901GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001902 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001904 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001905
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001906 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907
Dustin Graves080069b2016-04-05 13:48:15 -06001908 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001909 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001910 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001911}
1912
Chia-I Wu01ca2372016-05-13 14:37:49 +08001913VKAPI_ATTR void VKAPI_CALL
1914GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001915 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001916 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001918
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001919 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920
Dustin Graves080069b2016-04-05 13:48:15 -06001921 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001922 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001923 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001924}
1925
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001926bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1927 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1928 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001929 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001930 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1931 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001932 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1933 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001934 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1935 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001936 return false;
1937 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001938 }
1939
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001940 return true;
1941}
1942
Chia-I Wu01ca2372016-05-13 14:37:49 +08001943VKAPI_ATTR void VKAPI_CALL
1944GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1945 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001946 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001947 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001948 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001949
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001950 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001951 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001952
Dustin Graves080069b2016-04-05 13:48:15 -06001953 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001954 get_dispatch_table(pc_device_table_map, device)
1955 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001956
1957 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1958 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001959}
1960
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001961bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1962 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1963 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001964 if (pProperties != nullptr) {
1965 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1966 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001967 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1968 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001969 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1970 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001971 return false;
1972 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001973 }
1974
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001975 return true;
1976}
1977
Chia-I Wu01ca2372016-05-13 14:37:49 +08001978VKAPI_ATTR void VKAPI_CALL
1979GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1980 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1981 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001982 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001983 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001984 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001985
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001986 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001987 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001988
Dustin Graves080069b2016-04-05 13:48:15 -06001989 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001990 get_dispatch_table(pc_instance_table_map, physicalDevice)
1991 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1992 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001994 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1995 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001996 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001997}
1998
Chia-I Wu01ca2372016-05-13 14:37:49 +08001999VKAPI_ATTR VkResult VKAPI_CALL
2000QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002001 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002002 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002003 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002004 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002005
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002006 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002007
Dustin Graves080069b2016-04-05 13:48:15 -06002008 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002009 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2010
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002011 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002012 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002013
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002014 return result;
2015}
2016
Chia-I Wu01ca2372016-05-13 14:37:49 +08002017VKAPI_ATTR VkResult VKAPI_CALL
2018CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002019 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002020 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002022 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002023
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002024 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002025
Dustin Graves080069b2016-04-05 13:48:15 -06002026 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002027 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2028
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002029 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002030 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002031
2032 return result;
2033}
2034
Chia-I Wu01ca2372016-05-13 14:37:49 +08002035VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002036 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002037 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002038 assert(my_data != NULL);
2039
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002040 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002041
Dustin Graves080069b2016-04-05 13:48:15 -06002042 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002043 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002044 }
2045}
2046
Chia-I Wu01ca2372016-05-13 14:37:49 +08002047VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002048 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002049 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002050 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002051 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002052
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002053 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002054
Dustin Graves080069b2016-04-05 13:48:15 -06002055 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2057
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002058 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002059 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002060
2061 return result;
2062}
2063
Chia-I Wu01ca2372016-05-13 14:37:49 +08002064VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002065 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2066 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002067 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2068 assert(my_data != NULL);
2069
Dustin Graves20fd66f2016-04-18 18:33:21 -06002070 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002071
Dustin Graves20fd66f2016-04-18 18:33:21 -06002072 if (!skipCall) {
2073 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2074
2075 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2076 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002077
2078 return result;
2079}
2080
Chia-I Wu01ca2372016-05-13 14:37:49 +08002081VKAPI_ATTR VkResult VKAPI_CALL
2082WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002083 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002084 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002085 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002086 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002087
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002088 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002089
Dustin Graves080069b2016-04-05 13:48:15 -06002090 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002091 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2092
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002093 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002094 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002095
2096 return result;
2097}
2098
Chia-I Wu01ca2372016-05-13 14:37:49 +08002099VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2101 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002102 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002103 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002104 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002105
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002106 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002107
Dustin Graves080069b2016-04-05 13:48:15 -06002108 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002109 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2110
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002111 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002112 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002113
2114 return result;
2115}
2116
Chia-I Wu01ca2372016-05-13 14:37:49 +08002117VKAPI_ATTR void VKAPI_CALL
2118DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002119 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002120 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002121 assert(my_data != NULL);
2122
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002123 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002124
Dustin Graves080069b2016-04-05 13:48:15 -06002125 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002126 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002127 }
2128}
2129
Chia-I Wu01ca2372016-05-13 14:37:49 +08002130VKAPI_ATTR VkResult VKAPI_CALL
2131CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002132 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002133 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002134 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002135 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002136
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002137 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002138
Dustin Graves080069b2016-04-05 13:48:15 -06002139 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002140 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2141
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002142 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002143 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002144
2145 return result;
2146}
2147
Chia-I Wu01ca2372016-05-13 14:37:49 +08002148VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002149 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002150 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002151 assert(my_data != NULL);
2152
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002153 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002154
Dustin Graves080069b2016-04-05 13:48:15 -06002155 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002156 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002157 }
2158}
2159
Chia-I Wu01ca2372016-05-13 14:37:49 +08002160VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002161 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2162 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002163 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2164 assert(my_data != NULL);
2165
Dustin Graves20fd66f2016-04-18 18:33:21 -06002166 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002167
Dustin Graves20fd66f2016-04-18 18:33:21 -06002168 if (!skipCall) {
2169 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2170
2171 validate_result(my_data->report_data, "vkGetEventStatus", result);
2172 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002173
2174 return result;
2175}
2176
Chia-I Wu01ca2372016-05-13 14:37:49 +08002177VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002178 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2179 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002180 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2181 assert(my_data != NULL);
2182
Dustin Graves20fd66f2016-04-18 18:33:21 -06002183 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002184
Dustin Graves20fd66f2016-04-18 18:33:21 -06002185 if (!skipCall) {
2186 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2187
2188 validate_result(my_data->report_data, "vkSetEvent", result);
2189 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002190
2191 return result;
2192}
2193
Chia-I Wu01ca2372016-05-13 14:37:49 +08002194VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002195 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2196 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002197 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2198 assert(my_data != NULL);
2199
Dustin Graves20fd66f2016-04-18 18:33:21 -06002200 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002201
Dustin Graves20fd66f2016-04-18 18:33:21 -06002202 if (!skipCall) {
2203 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2204
2205 validate_result(my_data->report_data, "vkResetEvent", result);
2206 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002207
2208 return result;
2209}
2210
Chia-I Wu01ca2372016-05-13 14:37:49 +08002211VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2212 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002213 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002214 bool skip_call = false;
2215 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2216 assert(device_data != nullptr);
2217 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002218
Dustin Gravesc900f572016-05-16 11:07:59 -06002219 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002220
Dustin Gravesc900f572016-05-16 11:07:59 -06002221 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2222 if (pCreateInfo != nullptr) {
2223 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2224 // VkQueryPipelineStatisticFlagBits values
2225 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2226 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2227 skip_call |=
2228 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2229 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2230 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2231 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2232 }
2233 }
2234
2235 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002236 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2237
Dustin Gravesc900f572016-05-16 11:07:59 -06002238 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002239 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002240
2241 return result;
2242}
2243
Chia-I Wu01ca2372016-05-13 14:37:49 +08002244VKAPI_ATTR void VKAPI_CALL
2245DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002246 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002247 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002248 assert(my_data != NULL);
2249
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002250 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002251
Dustin Graves080069b2016-04-05 13:48:15 -06002252 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002253 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002254 }
2255}
2256
Chia-I Wu01ca2372016-05-13 14:37:49 +08002257VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2258 uint32_t queryCount, size_t dataSize, void *pData,
2259 VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002260 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002261 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002262 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002263 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002264
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002265 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002266 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002267
Dustin Graves080069b2016-04-05 13:48:15 -06002268 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002269 result = get_dispatch_table(pc_device_table_map, device)
2270 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002271
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002272 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002273 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002274
2275 return result;
2276}
2277
Chia-I Wu01ca2372016-05-13 14:37:49 +08002278VKAPI_ATTR VkResult VKAPI_CALL
2279CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002280 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002281 bool skip_call = false;
2282 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2283 assert(device_data != nullptr);
2284 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002285
Dustin Gravesc900f572016-05-16 11:07:59 -06002286 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002287
Dustin Gravesc900f572016-05-16 11:07:59 -06002288 if (pCreateInfo != nullptr) {
2289 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2290 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2291 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2292 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2293 skip_call |=
2294 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2295 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2296 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2297 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002298
Dustin Gravesc900f572016-05-16 11:07:59 -06002299 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2300 // queueFamilyIndexCount uint32_t values
2301 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2302 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2303 __LINE__, REQUIRED_PARAMETER, LayerName,
2304 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2305 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2306 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2307 }
2308
2309 // Ensure that the queue family indices were specified at device creation
2310 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2311 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2312 }
2313 }
2314
2315 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2317
Dustin Gravesc900f572016-05-16 11:07:59 -06002318 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002319 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002320
2321 return result;
2322}
2323
Chia-I Wu01ca2372016-05-13 14:37:49 +08002324VKAPI_ATTR void VKAPI_CALL
2325DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002326 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002328 assert(my_data != NULL);
2329
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002330 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002331
Dustin Graves080069b2016-04-05 13:48:15 -06002332 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002333 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002334 }
2335}
2336
Chia-I Wu01ca2372016-05-13 14:37:49 +08002337VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2338 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002339 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002340 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002341 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002342 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002343
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002344 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002345
Dustin Graves080069b2016-04-05 13:48:15 -06002346 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002347 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002349 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002350 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002351
2352 return result;
2353}
2354
Chia-I Wu01ca2372016-05-13 14:37:49 +08002355VKAPI_ATTR void VKAPI_CALL
2356DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002357 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002358 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002359 assert(my_data != NULL);
2360
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002361 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002362
Dustin Graves080069b2016-04-05 13:48:15 -06002363 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002364 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002365 }
2366}
2367
Chia-I Wu01ca2372016-05-13 14:37:49 +08002368VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2369 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002370 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2371 bool skip_call = false;
2372 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002373 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002374 debug_report_data *report_data = device_data->report_data;
2375
2376 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2377
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002378 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002379 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002380 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002381 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2382 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2383 skip_call |=
2384 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2385 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2386 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2387 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002388
Dustin Gravesc900f572016-05-16 11:07:59 -06002389 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2390 // queueFamilyIndexCount uint32_t values
2391 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2392 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2393 __LINE__, REQUIRED_PARAMETER, LayerName,
2394 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2395 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2396 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2397 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002398
2399 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2400 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2401 }
2402
2403 // width, height, and depth members of extent must be greater than 0
2404 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2405 0u);
2406 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2407 0u);
2408 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2409 0u);
2410
2411 // mipLevels must be greater than 0
2412 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2413 0u);
2414
2415 // arrayLayers must be greater than 0
2416 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2417 0u);
2418
2419 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2420 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2421 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2422 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2423 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
2424 }
2425
2426 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2427 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2428 // extent.height must be equal
2429 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2430 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2431 skip_call |=
2432 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2433 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2434 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2435 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
2436 }
2437
2438 if (pCreateInfo->extent.depth != 1) {
2439 skip_call |=
2440 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2441 LayerName,
2442 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2443 }
2444 }
2445
2446 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2447 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2448 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2449 skip_call |= log_msg(
2450 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2451 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2452 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2453 }
2454
2455 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2456 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2457 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2458 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2459 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2460 LayerName,
2461 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2462 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002463 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002464 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002465
Dustin Gravesf8032f22016-05-11 18:31:44 -06002466 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002467 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2468
Dustin Gravesf8032f22016-05-11 18:31:44 -06002469 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002470 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002471
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002472 return result;
2473}
2474
Chia-I Wu01ca2372016-05-13 14:37:49 +08002475VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002476 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002477 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002478 assert(my_data != NULL);
2479
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002480 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002481
Dustin Graves080069b2016-04-05 13:48:15 -06002482 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002483 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002484 }
2485}
2486
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002487bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2488 if (pSubresource != nullptr) {
2489 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2490 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002491 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2492 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002493 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2494 return false;
2495 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002496 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002497
2498 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002499}
2500
Chia-I Wu01ca2372016-05-13 14:37:49 +08002501VKAPI_ATTR void VKAPI_CALL
2502GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002503 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002504 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002505 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002506
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002507 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002508
Dustin Graves080069b2016-04-05 13:48:15 -06002509 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002510 PreGetImageSubresourceLayout(device, pSubresource);
2511
2512 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002513 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002514}
2515
Chia-I Wu01ca2372016-05-13 14:37:49 +08002516VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2517 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002518 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002519 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002520 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002521 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002522 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002523
Dustin Graves0b70a632016-04-27 17:44:56 -06002524 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525
Dustin Graves0b70a632016-04-27 17:44:56 -06002526 if (pCreateInfo != nullptr) {
2527 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2528 if (pCreateInfo->subresourceRange.layerCount != 1) {
2529 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2530 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2531 "pCreateInfo->subresourceRange.layerCount must be 1",
2532 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2533 }
2534 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2535 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)) {
2536 if (pCreateInfo->subresourceRange.layerCount < 1) {
2537 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2538 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2539 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2540 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2541 }
2542 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2543 if (pCreateInfo->subresourceRange.layerCount != 6) {
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_CUBE, "
2546 "pCreateInfo->subresourceRange.layerCount must be 6");
2547 }
2548 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2549 if ((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) {
2550 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2551 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2552 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2553 }
2554 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2555 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2556 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2557 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2558 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2559 }
2560
2561 if (pCreateInfo->subresourceRange.layerCount != 1) {
2562 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2563 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2564 "pCreateInfo->subresourceRange.layerCount must be 1");
2565 }
2566 }
2567 }
2568
2569 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002570 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2571
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002572 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002573 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002574
2575 return result;
2576}
2577
Chia-I Wu01ca2372016-05-13 14:37:49 +08002578VKAPI_ATTR void VKAPI_CALL
2579DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002580 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002581 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002582 assert(my_data != NULL);
2583
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002584 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002585
Dustin Graves080069b2016-04-05 13:48:15 -06002586 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002587 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002588 }
2589}
2590
Chia-I Wu01ca2372016-05-13 14:37:49 +08002591VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2592 const VkAllocationCallbacks *pAllocator,
2593 VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002594 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002595 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002596 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002597 assert(my_data != NULL);
2598
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002599 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002600
Dustin Graves080069b2016-04-05 13:48:15 -06002601 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002602 result =
2603 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002604
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002605 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002606 }
2607
Michael Lentine03d8e572015-09-15 14:59:14 -05002608 return result;
2609}
2610
Chia-I Wu01ca2372016-05-13 14:37:49 +08002611VKAPI_ATTR void VKAPI_CALL
2612DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002613 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002614 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002615 assert(my_data != NULL);
2616
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002617 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002618
Dustin Graves080069b2016-04-05 13:48:15 -06002619 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002620 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002621 }
2622}
2623
Chia-I Wu01ca2372016-05-13 14:37:49 +08002624VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2625 const VkAllocationCallbacks *pAllocator,
2626 VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002627 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002628 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002629 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002630 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002631
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002632 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002633
Dustin Graves080069b2016-04-05 13:48:15 -06002634 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002635 result =
2636 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002637
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002638 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002639 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002640
2641 return result;
2642}
2643
Chia-I Wu01ca2372016-05-13 14:37:49 +08002644VKAPI_ATTR void VKAPI_CALL
2645DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002646 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002647 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002648 assert(my_data != NULL);
2649
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002650 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002651
Dustin Graves080069b2016-04-05 13:48:15 -06002652 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002653 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002654 }
2655}
2656
Chia-I Wu01ca2372016-05-13 14:37:49 +08002657VKAPI_ATTR VkResult VKAPI_CALL
2658GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002659 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002660 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002661 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002663
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002664 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665
Dustin Graves080069b2016-04-05 13:48:15 -06002666 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002667 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2668
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002669 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002670 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002671
2672 return result;
2673}
2674
Chia-I Wu01ca2372016-05-13 14:37:49 +08002675VKAPI_ATTR VkResult VKAPI_CALL
2676MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002677 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002678 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002679 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002680 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002681
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002682 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002683
Dustin Graves080069b2016-04-05 13:48:15 -06002684 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002685 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2686
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002687 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002688 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002689
2690 return result;
2691}
2692
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002693bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002694 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2695
2696 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002697 if (pCreateInfos != nullptr) {
2698 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2699 if (pCreateInfos->basePipelineIndex != -1) {
2700 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002701 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2702 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002703 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2704 "pCreateInfos->flags "
2705 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2706 return false;
2707 }
2708 }
2709
2710 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2711 if (pCreateInfos->basePipelineIndex != -1) {
2712 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002713 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2714 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002715 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2716 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2717 "VK_NULL_HANDLE");
2718 return false;
2719 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002720 }
2721 }
2722
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002723 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002724 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002725 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2726 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002727 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2728 "unrecognized enumerator");
2729 return false;
2730 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002731 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002732
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002733 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002734 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002735 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002736 pCreateInfos[i].pStages[j].pName);
2737 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002738 }
2739
2740 return true;
2741}
2742
Chia-I Wu01ca2372016-05-13 14:37:49 +08002743VKAPI_ATTR VkResult VKAPI_CALL
2744CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2745 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2746 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002747 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002748 bool skip_call = false;
2749 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2750 assert(device_data != nullptr);
2751 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002752
Dustin Gravesc900f572016-05-16 11:07:59 -06002753 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2754 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002755
Dustin Gravesc900f572016-05-16 11:07:59 -06002756 if (pCreateInfos != nullptr) {
2757 for (uint32_t i = 0; i < createInfoCount; ++i) {
2758 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2759 if (pCreateInfos[i].pTessellationState == nullptr) {
2760 if (pCreateInfos[i].pStages != nullptr) {
2761 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2762 // pTessellationState must not be NULL
2763 bool has_control = false;
2764 bool has_eval = false;
2765
2766 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2767 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2768 has_control = true;
2769 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2770 has_eval = true;
2771 }
2772 }
2773
2774 if (has_control && has_eval) {
2775 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2776 __LINE__, REQUIRED_PARAMETER, LayerName,
2777 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2778 "control shader stage and a tessellation evaluation shader stage, "
2779 "pCreateInfos[%d].pTessellationState must not be NULL",
2780 i, i);
2781 }
2782 }
Dustin Graves629259b2016-05-30 16:14:27 -06002783 } else {
2784 skip_call |=
2785 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext",
2786 NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL);
2787
2788 skip_call |=
2789 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags",
2790 pCreateInfos[i].pTessellationState->flags);
2791
2792 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2793 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2794 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2795 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2796 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2797 i);
2798 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002799 }
2800
2801 if (pCreateInfos[i].pViewportState == nullptr) {
2802 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2803 // valid VkPipelineViewportStateCreateInfo structure
2804 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2805 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2806 skip_call |= log_msg(
2807 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2808 REQUIRED_PARAMETER, LayerName,
2809 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2810 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2811 i, i);
2812 }
2813 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002814 skip_call |=
2815 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL,
2816 pCreateInfos[i].pViewportState->pNext, 0, NULL);
2817
2818 skip_call |=
2819 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags",
2820 pCreateInfos[i].pViewportState->flags);
2821
Dustin Gravesc900f572016-05-16 11:07:59 -06002822 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2823 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2824 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2825 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2826 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2827 i);
2828 }
2829
2830 if (pCreateInfos[i].pDynamicState != nullptr) {
2831 bool has_dynamic_viewport = false;
2832 bool has_dynamic_scissor = false;
2833
2834 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2835 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2836 has_dynamic_viewport = true;
2837 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2838 has_dynamic_scissor = true;
2839 }
2840 }
2841
2842 // viewportCount must be greater than 0
2843 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2844 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2845 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2846 __LINE__, REQUIRED_PARAMETER, LayerName,
2847 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2848 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2849 "must be greater than 0",
2850 i, i);
2851 }
2852
2853 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2854 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2855 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2856 skip_call |=
2857 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2858 __LINE__, REQUIRED_PARAMETER, LayerName,
2859 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2860 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2861 i, i);
2862 }
2863
2864 // scissorCount must be greater than 0
2865 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2866 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2867 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2868 __LINE__, REQUIRED_PARAMETER, LayerName,
2869 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2870 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2871 "must be greater than 0",
2872 i, i);
2873 }
2874
2875 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2876 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2877 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2878 skip_call |=
2879 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2880 __LINE__, REQUIRED_PARAMETER, LayerName,
2881 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2882 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2883 i, i);
2884 }
2885 }
2886 }
2887
2888 if (pCreateInfos[i].pMultisampleState == nullptr) {
2889 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2890 // a valid VkPipelineMultisampleStateCreateInfo structure
2891 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2892 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2893 skip_call |=
2894 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2895 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2896 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2897 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2898 i, i);
2899 }
Dustin Graves629259b2016-05-30 16:14:27 -06002900 } else {
2901 skip_call |=
2902 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext",
2903 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL);
2904
2905 skip_call |=
2906 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags",
2907 pCreateInfos[i].pMultisampleState->flags);
2908
2909 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2910 "pCreateInfos[i].pMultisampleState->sampleShadingEnable",
2911 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
2912
2913 skip_call |= validate_array(
2914 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples",
2915 "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples,
2916 pCreateInfos[i].pMultisampleState->pSampleMask, true, false);
2917
2918 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2919 "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable",
2920 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
2921
2922 skip_call |=
2923 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable",
2924 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
2925
2926 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2927 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2928 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2929 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2930 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2931 i);
2932 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002933 }
2934
2935 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06002936 if (pCreateInfos[i].pDepthStencilState != nullptr) {
2937 skip_call |=
2938 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext",
2939 NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL);
2940
2941 skip_call |=
2942 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags",
2943 pCreateInfos[i].pDepthStencilState->flags);
2944
2945 skip_call |=
2946 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable",
2947 pCreateInfos[i].pDepthStencilState->depthTestEnable);
2948
2949 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2950 "pCreateInfos[i].pDepthStencilState->depthWriteEnable",
2951 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
2952
2953 skip_call |= validate_ranged_enum(
2954 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp",
2955 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp);
2956
2957 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2958 "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable",
2959 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
2960
2961 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
2962 "pCreateInfos[i].pDepthStencilState->stencilTestEnable",
2963 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
2964
2965 skip_call |= validate_ranged_enum(
2966 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp",
2967 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp);
2968
2969 skip_call |= validate_ranged_enum(
2970 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp",
2971 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp);
2972
2973 skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
2974 "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp",
2975 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
2976 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
2977
2978 skip_call |= validate_ranged_enum(
2979 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp",
2980 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp);
2981
2982 skip_call |= validate_ranged_enum(
2983 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp",
2984 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
2985
2986 skip_call |= validate_ranged_enum(
2987 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp",
2988 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
2989
2990 skip_call |= validate_ranged_enum(
2991 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp",
2992 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp);
2993
2994 skip_call |= validate_ranged_enum(
2995 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp",
2996 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp);
2997
2998 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
2999 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3000 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3001 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3002 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3003 i);
3004 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003005 }
3006
3007 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3008 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003009 skip_call |=
3010 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL,
3011 pCreateInfos[i].pColorBlendState->pNext, 0, NULL);
3012
3013 skip_call |=
3014 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags",
3015 pCreateInfos[i].pColorBlendState->flags);
3016
3017 skip_call |=
3018 validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable",
3019 pCreateInfos[i].pColorBlendState->logicOpEnable);
3020
3021 skip_call |= validate_array(
3022 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount",
3023 "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount,
3024 pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3025
3026 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3027 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3028 ++attachmentIndex) {
3029 skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3030 "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable",
3031 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3032
3033 skip_call |= validate_ranged_enum(
3034 report_data, "vkCreateGraphicsPipelines",
3035 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor",
3036 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3037 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3038
3039 skip_call |= validate_ranged_enum(
3040 report_data, "vkCreateGraphicsPipelines",
3041 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor",
3042 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3043 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3044
3045 skip_call |= validate_ranged_enum(
3046 report_data, "vkCreateGraphicsPipelines",
3047 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3048 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3049
3050 skip_call |= validate_ranged_enum(
3051 report_data, "vkCreateGraphicsPipelines",
3052 "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor",
3053 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3054 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3055
3056 skip_call |= validate_ranged_enum(
3057 report_data, "vkCreateGraphicsPipelines",
3058 "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor",
3059 VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3060 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3061
3062 skip_call |= validate_ranged_enum(
3063 report_data, "vkCreateGraphicsPipelines",
3064 "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE,
3065 VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3066
3067 skip_call |=
3068 validate_flags(report_data, "vkCreateGraphicsPipelines",
3069 "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask",
3070 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3071 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3072 }
3073 }
3074
Dustin Gravesc900f572016-05-16 11:07:59 -06003075 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3076 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3077 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3078 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3079 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3080 i);
3081 }
3082
3083 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3084 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3085 skip_call |= validate_ranged_enum(
3086 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
3087 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3088 }
3089 }
3090 }
3091 }
3092
3093 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003094 PreCreateGraphicsPipelines(device, pCreateInfos);
3095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003096 result = get_dispatch_table(pc_device_table_map, device)
3097 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003098
Dustin Gravesc900f572016-05-16 11:07:59 -06003099 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003100 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003101
3102 return result;
3103}
3104
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003105bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003106 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3107
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003108 if (pCreateInfos != nullptr) {
3109 // TODO: Handle count!
3110 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06003111 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003112 }
3113
3114 return true;
3115}
3116
Chia-I Wu01ca2372016-05-13 14:37:49 +08003117VKAPI_ATTR VkResult VKAPI_CALL
3118CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3119 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3120 VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003121 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003122 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003123 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003124 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003125
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003126 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003127 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003128
Dustin Graves080069b2016-04-05 13:48:15 -06003129 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003130 PreCreateComputePipelines(device, pCreateInfos);
3131
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003132 result = get_dispatch_table(pc_device_table_map, device)
3133 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003134
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003135 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003136 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003137
3138 return result;
3139}
3140
Chia-I Wu01ca2372016-05-13 14:37:49 +08003141VKAPI_ATTR void VKAPI_CALL
3142DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003143 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003145 assert(my_data != NULL);
3146
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003147 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003148
Dustin Graves080069b2016-04-05 13:48:15 -06003149 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003150 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003151 }
3152}
3153
Chia-I Wu01ca2372016-05-13 14:37:49 +08003154VKAPI_ATTR VkResult VKAPI_CALL
3155CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3156 VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003157 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003158 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003159 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003160 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003161
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003162 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003163
Dustin Graves080069b2016-04-05 13:48:15 -06003164 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003165 result =
3166 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003167
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003168 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003169 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003170
3171 return result;
3172}
3173
Chia-I Wu01ca2372016-05-13 14:37:49 +08003174VKAPI_ATTR void VKAPI_CALL
3175DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003176 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003177 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003178 assert(my_data != NULL);
3179
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003180 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003181
Dustin Graves080069b2016-04-05 13:48:15 -06003182 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003183 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003184 }
3185}
3186
Chia-I Wu01ca2372016-05-13 14:37:49 +08003187VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3188 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003189 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003190 bool skip_call = false;
3191 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3192 assert(device_data != NULL);
3193 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003194
Dustin Gravesc900f572016-05-16 11:07:59 -06003195 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003196
Dustin Gravesc900f572016-05-16 11:07:59 -06003197 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3198 if (pCreateInfo != nullptr) {
3199 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3200 if (pCreateInfo->compareEnable == VK_TRUE) {
3201 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3202 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3203 }
3204
3205 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3206 // valid VkBorderColor value
3207 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3208 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3209 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3210 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3211 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3212 }
3213 }
3214
3215 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003216 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3217
Dustin Gravesc900f572016-05-16 11:07:59 -06003218 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003219 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003220
3221 return result;
3222}
3223
Chia-I Wu01ca2372016-05-13 14:37:49 +08003224VKAPI_ATTR void VKAPI_CALL
3225DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003226 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003227 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003228 assert(my_data != NULL);
3229
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003230 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003231
Dustin Graves080069b2016-04-05 13:48:15 -06003232 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003233 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003234 }
3235}
3236
Chia-I Wu01ca2372016-05-13 14:37:49 +08003237VKAPI_ATTR VkResult VKAPI_CALL
3238CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3239 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003240 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003241 bool skip_call = false;
3242 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3243 assert(device_data != nullptr);
3244 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003245
Dustin Gravesc900f572016-05-16 11:07:59 -06003246 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003247
Dustin Gravesc900f572016-05-16 11:07:59 -06003248 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3249 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3250 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3251 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3252 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3253 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3254 // valid VkSampler handles
3255 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3256 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3257 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3258 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3259 ++descriptor_index) {
3260 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3261 skip_call |=
3262 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3263 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3264 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3265 " specified as VK_NULL_HANDLE",
3266 i, descriptor_index);
3267 }
3268 }
3269 }
3270
3271 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3272 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3273 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3274 skip_call |=
3275 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3276 UNRECOGNIZED_VALUE, LayerName,
3277 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3278 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3279 i, i);
3280 }
3281 }
3282 }
3283 }
3284
3285 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003286 result =
3287 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003288
Dustin Gravesc900f572016-05-16 11:07:59 -06003289 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003290 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003291
3292 return result;
3293}
3294
Chia-I Wu01ca2372016-05-13 14:37:49 +08003295VKAPI_ATTR void VKAPI_CALL
3296DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003297 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003298 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003299 assert(my_data != NULL);
3300
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003301 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003302
Dustin Graves080069b2016-04-05 13:48:15 -06003303 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003304 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003305 }
3306}
3307
Chia-I Wu01ca2372016-05-13 14:37:49 +08003308VKAPI_ATTR VkResult VKAPI_CALL
3309CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3310 VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003312 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003313 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003314 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003315
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003316 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003317
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003318 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3319
Dustin Graves080069b2016-04-05 13:48:15 -06003320 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003321 result =
3322 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003323
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003324 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003325 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003326
3327 return result;
3328}
3329
Chia-I Wu01ca2372016-05-13 14:37:49 +08003330VKAPI_ATTR void VKAPI_CALL
3331DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003332 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003333 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003334 assert(my_data != NULL);
3335
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003336 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003337
Dustin Graves080069b2016-04-05 13:48:15 -06003338 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003339 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003340 }
3341}
3342
Chia-I Wu01ca2372016-05-13 14:37:49 +08003343VKAPI_ATTR VkResult VKAPI_CALL
3344ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003345 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3346 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003347 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3348 assert(my_data != NULL);
3349
Dustin Graves20fd66f2016-04-18 18:33:21 -06003350 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003351
Dustin Graves20fd66f2016-04-18 18:33:21 -06003352 if (!skipCall) {
3353 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3354
3355 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3356 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003357
3358 return result;
3359}
3360
Chia-I Wu01ca2372016-05-13 14:37:49 +08003361VKAPI_ATTR VkResult VKAPI_CALL
3362AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003363 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003364 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003366 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003367
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003368 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003369
Dustin Graves080069b2016-04-05 13:48:15 -06003370 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003371 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3372
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003373 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003374 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003375
3376 return result;
3377}
3378
Chia-I Wu01ca2372016-05-13 14:37:49 +08003379VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3380 uint32_t descriptorSetCount,
3381 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003382 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003383 bool skip_call = false;
3384 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3385 assert(device_data != nullptr);
3386 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003387
Dustin Gravesc900f572016-05-16 11:07:59 -06003388 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003389
Dustin Gravesc900f572016-05-16 11:07:59 -06003390 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3391 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3392 // validate_array()
3393 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3394 pDescriptorSets, true, true);
3395
3396 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003397 result = get_dispatch_table(pc_device_table_map, device)
3398 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003399
Dustin Gravesc900f572016-05-16 11:07:59 -06003400 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003401 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003402
3403 return result;
3404}
3405
Chia-I Wu01ca2372016-05-13 14:37:49 +08003406VKAPI_ATTR void VKAPI_CALL
3407UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3408 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003409 bool skip_call = false;
3410 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3411 assert(device_data != NULL);
3412 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003413
Dustin Gravesc900f572016-05-16 11:07:59 -06003414 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3415 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003416
Dustin Gravesc900f572016-05-16 11:07:59 -06003417 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3418 if (pDescriptorWrites != NULL) {
3419 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3420 // descriptorCount must be greater than 0
3421 if (pDescriptorWrites[i].descriptorCount == 0) {
3422 skip_call |=
3423 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3424 REQUIRED_PARAMETER, LayerName,
3425 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3426 }
3427
3428 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3429 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3430 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3431 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3432 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3433 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3434 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3435 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3436 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3437 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3438 __LINE__, REQUIRED_PARAMETER, LayerName,
3439 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3440 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3441 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3442 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3443 i, i);
3444 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3445 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3446 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3447 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3448 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3449 ++descriptor_index) {
3450 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3451 "pDescriptorWrites[i].pImageInfo[i].imageView",
3452 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3453 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3454 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3455 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3456 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3457 }
3458 }
3459 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3460 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3461 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3462 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3463 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3464 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3465 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3466 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3467 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3468 __LINE__, REQUIRED_PARAMETER, LayerName,
3469 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3470 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3471 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3472 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3473 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003474 } else {
3475 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3476 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3477 "pDescriptorWrites[i].pBufferInfo[i].buffer",
3478 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3479 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003480 }
3481 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3482 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3483 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3484 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3485 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3486 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3487 __LINE__, REQUIRED_PARAMETER, LayerName,
3488 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3489 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3490 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3491 i, i);
3492 } else {
3493 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3494 ++descriptor_index) {
3495 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3496 "pDescriptorWrites[i].pTexelBufferView[i]",
3497 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3498 }
3499 }
3500 }
3501 }
3502 }
3503
3504 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003505 get_dispatch_table(pc_device_table_map, device)
3506 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003507 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003508}
3509
Chia-I Wu01ca2372016-05-13 14:37:49 +08003510VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3511 const VkAllocationCallbacks *pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003512 VkFramebuffer *pFramebuffer) {
3513 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003514 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003515 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003516 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003517
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003518 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003519
Dustin Graves080069b2016-04-05 13:48:15 -06003520 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003521 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3522
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003523 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003524 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003525
3526 return result;
3527}
3528
Chia-I Wu01ca2372016-05-13 14:37:49 +08003529VKAPI_ATTR void VKAPI_CALL
3530DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003531 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003532 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003533 assert(my_data != NULL);
3534
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003535 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003536
Dustin Graves080069b2016-04-05 13:48:15 -06003537 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003538 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003539 }
3540}
3541
Chia-I Wu01ca2372016-05-13 14:37:49 +08003542VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3543 const VkAllocationCallbacks *pAllocator,
3544 VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003545 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003546 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003547 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003548 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003549
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003550 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003551
Dustin Graves080069b2016-04-05 13:48:15 -06003552 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003553 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3554
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003555 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003556 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003557
3558 return result;
3559}
3560
Chia-I Wu01ca2372016-05-13 14:37:49 +08003561VKAPI_ATTR void VKAPI_CALL
3562DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003563 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003564 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003565 assert(my_data != NULL);
3566
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003567 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003568
Dustin Graves080069b2016-04-05 13:48:15 -06003569 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003570 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003571 }
3572}
3573
Chia-I Wu01ca2372016-05-13 14:37:49 +08003574VKAPI_ATTR void VKAPI_CALL
3575GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003576 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003577 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003578 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003579
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003580 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003581
Dustin Graves080069b2016-04-05 13:48:15 -06003582 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003583 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003584 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003585}
3586
Chia-I Wu01ca2372016-05-13 14:37:49 +08003587VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3588 const VkAllocationCallbacks *pAllocator,
3589 VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003590 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003591 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003592 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003593 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003594
Dustin Gravesde628532016-04-21 16:30:17 -06003595 skipCall |=
3596 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003597
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003598 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003599
Dustin Graves080069b2016-04-05 13:48:15 -06003600 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003601 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3602
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003603 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003604 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003605
3606 return result;
3607}
3608
Chia-I Wu01ca2372016-05-13 14:37:49 +08003609VKAPI_ATTR void VKAPI_CALL
3610DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003611 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003612 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003613 assert(my_data != NULL);
3614
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003615 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003616
Dustin Graves080069b2016-04-05 13:48:15 -06003617 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003618 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003619 }
3620}
3621
Chia-I Wu01ca2372016-05-13 14:37:49 +08003622VKAPI_ATTR VkResult VKAPI_CALL
3623ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003624 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3625 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003626 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3627 assert(my_data != NULL);
3628
Dustin Graves20fd66f2016-04-18 18:33:21 -06003629 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003630
Dustin Graves20fd66f2016-04-18 18:33:21 -06003631 if (!skipCall) {
3632 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3633
3634 validate_result(my_data->report_data, "vkResetCommandPool", result);
3635 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003636
3637 return result;
3638}
3639
Chia-I Wu01ca2372016-05-13 14:37:49 +08003640VKAPI_ATTR VkResult VKAPI_CALL
3641AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003642 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003643 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003644 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003645 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003646
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003647 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003648
Dustin Graves080069b2016-04-05 13:48:15 -06003649 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003650 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3651
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003652 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003653 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003654
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003655 return result;
3656}
3657
Chia-I Wu01ca2372016-05-13 14:37:49 +08003658VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3659 uint32_t commandBufferCount,
3660 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003661 bool skip_call = false;
3662 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3663 assert(device_data != nullptr);
3664 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003665
Dustin Gravesc900f572016-05-16 11:07:59 -06003666 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003667
Dustin Gravesc900f572016-05-16 11:07:59 -06003668 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3669 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3670 // validate_array()
3671 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3672 pCommandBuffers, true, true);
3673
3674 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003675 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003676 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003677 }
3678}
3679
Chia-I Wu01ca2372016-05-13 14:37:49 +08003680VKAPI_ATTR VkResult VKAPI_CALL
3681BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003682 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003683 bool skip_call = false;
3684 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3685 assert(device_data != nullptr);
3686 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003687
Dustin Gravesc900f572016-05-16 11:07:59 -06003688 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003689
Dustin Gravesc900f572016-05-16 11:07:59 -06003690 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3691 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3692 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3693 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3694 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3695
3696 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003697 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
3698 pBeginInfo->pInheritanceInfo->pNext, 0, NULL);
3699
3700 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3701 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3702
Dustin Gravesc900f572016-05-16 11:07:59 -06003703 // TODO: This only needs to be validated when the inherited queries feature is enabled
3704 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3705 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3706
3707 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3708 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3709 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3710 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3711 }
3712
3713 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003714 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3715
Dustin Gravesc900f572016-05-16 11:07:59 -06003716 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003717 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003718
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003719 return result;
3720}
3721
Chia-I Wu01ca2372016-05-13 14:37:49 +08003722VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3724 assert(my_data != NULL);
3725
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003726 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003727
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003728 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003729
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003730 return result;
3731}
3732
Chia-I Wu01ca2372016-05-13 14:37:49 +08003733VKAPI_ATTR VkResult VKAPI_CALL
3734ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003735 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003736 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3737 assert(my_data != NULL);
3738
Dustin Graves16d18972016-05-09 17:36:57 -06003739 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003740
Dustin Graves16d18972016-05-09 17:36:57 -06003741 if (!skip_call) {
3742 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3743
3744 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3745 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003746
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003747 return result;
3748}
3749
Chia-I Wu01ca2372016-05-13 14:37:49 +08003750VKAPI_ATTR void VKAPI_CALL
3751CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003752 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003753 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3754 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003755
Dustin Graves29148ff2016-03-23 19:44:00 -06003756 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3757
Dustin Graves080069b2016-04-05 13:48:15 -06003758 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003759 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3760 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003761}
3762
Chia-I Wu01ca2372016-05-13 14:37:49 +08003763VKAPI_ATTR void VKAPI_CALL
3764CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003765 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003766 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003767 assert(my_data != NULL);
3768
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003769 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003770
Dustin Graves080069b2016-04-05 13:48:15 -06003771 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003772 get_dispatch_table(pc_device_table_map, commandBuffer)
3773 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003774 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003775}
3776
Chia-I Wu01ca2372016-05-13 14:37:49 +08003777VKAPI_ATTR void VKAPI_CALL
3778CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003779 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003781 assert(my_data != NULL);
3782
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003783 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003784
Dustin Graves080069b2016-04-05 13:48:15 -06003785 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003786 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3787 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003788}
3789
Chia-I Wu01ca2372016-05-13 14:37:49 +08003790VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003791 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003792}
3793
Chia-I Wu01ca2372016-05-13 14:37:49 +08003794VKAPI_ATTR void VKAPI_CALL
3795CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003796 get_dispatch_table(pc_device_table_map, commandBuffer)
3797 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003798}
3799
Chia-I Wu01ca2372016-05-13 14:37:49 +08003800VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003801 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003802 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003803 assert(my_data != NULL);
3804
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003805 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003806
Dustin Graves080069b2016-04-05 13:48:15 -06003807 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003808 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3809 }
Cody Northrop12365112015-08-17 11:10:49 -06003810}
3811
Chia-I Wu01ca2372016-05-13 14:37:49 +08003812VKAPI_ATTR void VKAPI_CALL
3813CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003814 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003815}
3816
Chia-I Wu01ca2372016-05-13 14:37:49 +08003817VKAPI_ATTR void VKAPI_CALL
3818CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003819 bool skipCall = false;
3820 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3821 assert(my_data != NULL);
3822
3823 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3824
3825 if (!skipCall) {
3826 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3827 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003828}
3829
Chia-I Wu01ca2372016-05-13 14:37:49 +08003830VKAPI_ATTR void VKAPI_CALL
3831CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003832 bool skipCall = false;
3833 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3834 assert(my_data != NULL);
3835
3836 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3837
3838 if (!skipCall) {
3839 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3840 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003841}
3842
Chia-I Wu01ca2372016-05-13 14:37:49 +08003843VKAPI_ATTR void VKAPI_CALL
3844CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003845 bool skipCall = false;
3846 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3847 assert(my_data != NULL);
3848
3849 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3850
3851 if (!skipCall) {
3852 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3853 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003854}
3855
Chia-I Wu01ca2372016-05-13 14:37:49 +08003856VKAPI_ATTR void VKAPI_CALL
3857CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3858 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3859 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003860 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003861 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003862 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003863
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003864 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003865 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003866
Dustin Graves080069b2016-04-05 13:48:15 -06003867 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003868 get_dispatch_table(pc_device_table_map, commandBuffer)
3869 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3870 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003871 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003872}
3873
Chia-I Wu01ca2372016-05-13 14:37:49 +08003874VKAPI_ATTR void VKAPI_CALL
3875CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003876 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003877 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3878 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003879
Dustin Graves29148ff2016-03-23 19:44:00 -06003880 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3881
Dustin Graves080069b2016-04-05 13:48:15 -06003882 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003883 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3884 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003885}
3886
Chia-I Wu01ca2372016-05-13 14:37:49 +08003887VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3888 uint32_t bindingCount, const VkBuffer *pBuffers,
3889 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003890 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003891 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003892 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003893
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003894 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003895
Dustin Graves080069b2016-04-05 13:48:15 -06003896 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003897 get_dispatch_table(pc_device_table_map, commandBuffer)
3898 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003899 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003900}
3901
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003902bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3903 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003904 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003905 // 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 -07003906 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003907 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3908 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003909 return false;
3910 }
3911
3912 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003913 // 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 -07003914 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003915 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3916 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003917 return false;
3918 }
3919
3920 return true;
3921}
3922
Chia-I Wu01ca2372016-05-13 14:37:49 +08003923VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3924 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003925 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003926
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003927 get_dispatch_table(pc_device_table_map, commandBuffer)
3928 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003929}
3930
Chia-I Wu01ca2372016-05-13 14:37:49 +08003931VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3932 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3933 uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 get_dispatch_table(pc_device_table_map, commandBuffer)
3935 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003936}
3937
Chia-I Wu01ca2372016-05-13 14:37:49 +08003938VKAPI_ATTR void VKAPI_CALL
3939CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003940 bool skipCall = false;
3941 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3942 assert(my_data != NULL);
3943
3944 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3945
3946 if (!skipCall) {
3947 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3948 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003949}
3950
Chia-I Wu01ca2372016-05-13 14:37:49 +08003951VKAPI_ATTR void VKAPI_CALL
3952CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003953 bool skipCall = false;
3954 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3955 assert(my_data != NULL);
3956
3957 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3958
3959 if (!skipCall) {
3960 get_dispatch_table(pc_device_table_map, commandBuffer)
3961 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3962 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003963}
3964
Chia-I Wu01ca2372016-05-13 14:37:49 +08003965VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003966 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003967}
3968
Chia-I Wu01ca2372016-05-13 14:37:49 +08003969VKAPI_ATTR void VKAPI_CALL
3970CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003971 bool skipCall = false;
3972 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3973 assert(my_data != NULL);
3974
3975 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3976
3977 if (!skipCall) {
3978 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3979 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003980}
3981
Chia-I Wu01ca2372016-05-13 14:37:49 +08003982VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3983 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003984 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003985 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003986 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003987
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003988 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003989
Dustin Graves080069b2016-04-05 13:48:15 -06003990 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003991 get_dispatch_table(pc_device_table_map, commandBuffer)
3992 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003993 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003994}
3995
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003996bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3997 if (pRegions != nullptr) {
3998 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3999 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004000 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4001 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004002 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4003 return false;
4004 }
4005 if ((pRegions->dstSubresource.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->dstSubresource.aspectMask, is an unrecognized enumerator");
4010 return false;
4011 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004012 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004013
4014 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004015}
4016
Chia-I Wu01ca2372016-05-13 14:37:49 +08004017VKAPI_ATTR void VKAPI_CALL
4018CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4019 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004020 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004022 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004023
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004024 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004025 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004026
Dustin Graves080069b2016-04-05 13:48:15 -06004027 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004028 PreCmdCopyImage(commandBuffer, pRegions);
4029
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004030 get_dispatch_table(pc_device_table_map, commandBuffer)
4031 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004032 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004033}
4034
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004035bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4036 if (pRegions != nullptr) {
4037 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4038 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004039 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4040 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004041 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4042 return false;
4043 }
4044 if ((pRegions->dstSubresource.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->dstSubresource.aspectMask, is an unrecognized enumerator");
4049 return false;
4050 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004051 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004052
4053 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004054}
4055
Chia-I Wu01ca2372016-05-13 14:37:49 +08004056VKAPI_ATTR void VKAPI_CALL
4057CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4058 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06004059 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004060 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004061 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004062
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004063 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004064 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004065
Dustin Graves080069b2016-04-05 13:48:15 -06004066 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004067 PreCmdBlitImage(commandBuffer, pRegions);
4068
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004069 get_dispatch_table(pc_device_table_map, commandBuffer)
4070 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004071 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004072}
4073
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004074bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4075 if (pRegions != nullptr) {
4076 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4077 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004078 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4079 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004080 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4081 "enumerator");
4082 return false;
4083 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004084 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004085
4086 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004087}
4088
Chia-I Wu01ca2372016-05-13 14:37:49 +08004089VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4090 VkImage dstImage, VkImageLayout dstImageLayout,
4091 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004092 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004093 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004094 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004096 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004097 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004098
Dustin Graves080069b2016-04-05 13:48:15 -06004099 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004100 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4101
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004102 get_dispatch_table(pc_device_table_map, commandBuffer)
4103 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004104 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105}
4106
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004107bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4108 if (pRegions != nullptr) {
4109 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4110 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004111 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4112 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004113 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4114 "enumerator");
4115 return false;
4116 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004117 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004118
4119 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004120}
4121
Chia-I Wu01ca2372016-05-13 14:37:49 +08004122VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4123 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4124 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004125 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004126 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004127 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004128
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004129 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004130 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004131
Dustin Graves080069b2016-04-05 13:48:15 -06004132 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004133 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4134
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004135 get_dispatch_table(pc_device_table_map, commandBuffer)
4136 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004137 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004138}
4139
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004140VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4141 VkDeviceSize dataSize, const uint32_t *pData) {
4142 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004143 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004144 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004145
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004146 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004147
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004148 if (dstOffset & 3) {
4149 skip_call |=
4150 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4151 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4",
4152 dstOffset);
4153 }
4154
4155 if ((dataSize <= 0) || (dataSize > 65536)) {
4156 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4157 INVALID_USAGE, "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4158 "), must be greater than zero and less than or equal to 65536",
4159 dataSize);
4160 } else if (dataSize & 3) {
4161 skip_call |=
4162 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4163 "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4",
4164 dataSize);
4165 }
4166
4167 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004168 get_dispatch_table(pc_device_table_map, commandBuffer)
4169 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004170 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004171}
4172
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004173VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4174 VkDeviceSize size, uint32_t data) {
4175 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004176 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4177 assert(my_data != NULL);
4178
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004179 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004180
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004181 if (dstOffset & 3) {
4182 skip_call |= log_msg(
4183 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, "DL",
4184 "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
4185 }
4186
4187 if (size != VK_WHOLE_SIZE) {
4188 if (size <= 0) {
4189 skip_call |= log_msg(
4190 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4191 "DL", "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
4192 } else if (size & 3) {
4193 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4194 INVALID_USAGE, "DL",
4195 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4196 }
4197 }
4198
4199 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004200 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4201 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004202}
4203
Chia-I Wu01ca2372016-05-13 14:37:49 +08004204VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4205 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4206 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004207 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004208 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004209 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004210
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004211 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004212
Dustin Graves080069b2016-04-05 13:48:15 -06004213 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004214 get_dispatch_table(pc_device_table_map, commandBuffer)
4215 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004216 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004217}
4218
Chia-I Wu01ca2372016-05-13 14:37:49 +08004219VKAPI_ATTR void VKAPI_CALL
4220CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4221 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4222 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004223 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004224 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004225 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004226
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004227 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004228 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004229
Dustin Graves080069b2016-04-05 13:48:15 -06004230 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004231 get_dispatch_table(pc_device_table_map, commandBuffer)
4232 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004233 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004234}
4235
Chia-I Wu01ca2372016-05-13 14:37:49 +08004236VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4237 const VkClearAttachment *pAttachments, uint32_t rectCount,
4238 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004239 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004240 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004241 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004242
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004243 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004244
Dustin Graves080069b2016-04-05 13:48:15 -06004245 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004246 get_dispatch_table(pc_device_table_map, commandBuffer)
4247 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004248 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004249}
4250
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004251bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4252 if (pRegions != nullptr) {
4253 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4254 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4255 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004256 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4257 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004258 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4259 return false;
4260 }
4261 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4262 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4263 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004264 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4265 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004266 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4267 return false;
4268 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004269 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004270
4271 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004272}
4273
Chia-I Wu01ca2372016-05-13 14:37:49 +08004274VKAPI_ATTR void VKAPI_CALL
4275CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4276 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004277 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004278 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004279 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004280
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004281 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004283
Dustin Graves080069b2016-04-05 13:48:15 -06004284 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004285 PreCmdResolveImage(commandBuffer, pRegions);
4286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004287 get_dispatch_table(pc_device_table_map, commandBuffer)
4288 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004289 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004290}
4291
Chia-I Wu01ca2372016-05-13 14:37:49 +08004292VKAPI_ATTR void VKAPI_CALL
4293CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004294 bool skipCall = false;
4295 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4296 assert(my_data != NULL);
4297
4298 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4299
4300 if (!skipCall) {
4301 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4302 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004303}
4304
Chia-I Wu01ca2372016-05-13 14:37:49 +08004305VKAPI_ATTR void VKAPI_CALL
4306CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004307 bool skipCall = false;
4308 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4309 assert(my_data != NULL);
4310
4311 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4312
4313 if (!skipCall) {
4314 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4315 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004316}
4317
Chia-I Wu01ca2372016-05-13 14:37:49 +08004318VKAPI_ATTR void VKAPI_CALL
4319CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4320 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4321 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4322 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004323 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004325 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004326
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004327 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004328 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4329 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004330
Dustin Graves080069b2016-04-05 13:48:15 -06004331 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004332 get_dispatch_table(pc_device_table_map, commandBuffer)
4333 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4334 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004335 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004336}
4337
Chia-I Wu01ca2372016-05-13 14:37:49 +08004338VKAPI_ATTR void VKAPI_CALL
4339CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4340 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4341 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4342 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004343 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004344 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004345 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004346
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004347 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004348 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4349 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004350
Dustin Graves080069b2016-04-05 13:48:15 -06004351 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004352 get_dispatch_table(pc_device_table_map, commandBuffer)
4353 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4354 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004355 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004356}
4357
Chia-I Wu01ca2372016-05-13 14:37:49 +08004358VKAPI_ATTR void VKAPI_CALL
4359CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004360 bool skipCall = false;
4361 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4362 assert(my_data != NULL);
4363
4364 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4365
4366 if (!skipCall) {
4367 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4368 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004369}
4370
Chia-I Wu01ca2372016-05-13 14:37:49 +08004371VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004372 bool skipCall = false;
4373 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4374 assert(my_data != NULL);
4375
4376 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4377
4378 if (!skipCall) {
4379 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4380 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004381}
4382
Chia-I Wu01ca2372016-05-13 14:37:49 +08004383VKAPI_ATTR void VKAPI_CALL
4384CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004385 bool skipCall = false;
4386 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4387 assert(my_data != NULL);
4388
4389 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4390
4391 if (!skipCall) {
4392 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4393 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004394}
4395
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004396bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4397 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004398
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004399 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004400
4401 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004402}
4403
Chia-I Wu01ca2372016-05-13 14:37:49 +08004404VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4405 VkQueryPool queryPool, uint32_t query) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004406 bool skipCall = false;
4407 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4408 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004409
Dustin Graves20fd66f2016-04-18 18:33:21 -06004410 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4411
4412 if (!skipCall) {
4413 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4414
4415 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4416 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004417}
4418
Chia-I Wu01ca2372016-05-13 14:37:49 +08004419VKAPI_ATTR void VKAPI_CALL
4420CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4421 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004422 bool skipCall = false;
4423 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4424 assert(my_data != NULL);
4425
4426 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4427 dstOffset, stride, flags);
4428
4429 if (!skipCall) {
4430 get_dispatch_table(pc_device_table_map, commandBuffer)
4431 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4432 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004433}
4434
Chia-I Wu01ca2372016-05-13 14:37:49 +08004435VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4436 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4437 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004438 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004440 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004441
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004442 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004443
Dustin Graves080069b2016-04-05 13:48:15 -06004444 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004445 get_dispatch_table(pc_device_table_map, commandBuffer)
4446 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004447 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004448}
4449
Chia-I Wu01ca2372016-05-13 14:37:49 +08004450VKAPI_ATTR void VKAPI_CALL
4451CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004452 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004453 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004454 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004455
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004456 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004457
Dustin Graves080069b2016-04-05 13:48:15 -06004458 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004459 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004460 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004461}
4462
Chia-I Wu01ca2372016-05-13 14:37:49 +08004463VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004464 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004465 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4466 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004467
Dustin Graves29148ff2016-03-23 19:44:00 -06004468 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4469
Dustin Graves080069b2016-04-05 13:48:15 -06004470 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004471 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4472 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004473}
4474
Chia-I Wu01ca2372016-05-13 14:37:49 +08004475VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004476 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004477}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004478
Chia-I Wu01ca2372016-05-13 14:37:49 +08004479VKAPI_ATTR void VKAPI_CALL
4480CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004481 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004482 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004483 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004484
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004485 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004486
Dustin Graves080069b2016-04-05 13:48:15 -06004487 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004488 get_dispatch_table(pc_device_table_map, commandBuffer)
4489 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004490 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004491}
4492
Chia-I Wub02600c2016-05-20 07:11:22 +08004493VKAPI_ATTR VkResult VKAPI_CALL
4494EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4495 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4496}
4497
4498VKAPI_ATTR VkResult VKAPI_CALL
4499EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
4500 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4501}
4502
4503VKAPI_ATTR VkResult VKAPI_CALL
4504EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
4505 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4506 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4507
4508 return VK_ERROR_LAYER_NOT_PRESENT;
4509}
4510
Chia-I Wu01ca2372016-05-13 14:37:49 +08004511VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4512 const char *pLayerName, uint32_t *pCount,
4513 VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004514 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004515 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004516 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004517
4518 assert(physicalDevice);
4519
4520 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4521 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004522}
4523
Chia-I Wuf9b01382016-05-16 07:37:41 +08004524static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004525intercept_core_instance_command(const char *name);
4526
4527static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004528intercept_core_device_command(const char *name);
4529
Chia-I Wu01ca2372016-05-13 14:37:49 +08004530VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08004531 assert(device);
4532
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004533 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4534
Dustin Graves080069b2016-04-05 13:48:15 -06004535 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004536 return NULL;
4537 }
4538
Chia-I Wuf9b01382016-05-16 07:37:41 +08004539 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
4540 if (proc)
4541 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004542
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004543 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004544 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004545 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004546}
4547
Chia-I Wu01ca2372016-05-13 14:37:49 +08004548VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08004549 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08004550 if (!proc)
4551 proc = intercept_core_device_command(funcName);
Chia-I Wu617f2a42016-05-16 07:41:17 +08004552 if (proc)
4553 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004554
Chia-I Wu617f2a42016-05-16 07:41:17 +08004555 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004556
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004557 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004558
Chia-I Wu617f2a42016-05-16 07:41:17 +08004559 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
4560 if (proc)
4561 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004562
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004563 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004564 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004565 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004566}
Chia-I Wu99f701c2016-05-13 14:06:08 +08004567
Chia-I Wuf9b01382016-05-16 07:37:41 +08004568static PFN_vkVoidFunction
Chia-I Wu617f2a42016-05-16 07:41:17 +08004569intercept_core_instance_command(const char *name) {
4570 static const struct {
4571 const char *name;
4572 PFN_vkVoidFunction proc;
4573 } core_instance_commands[] = {
4574 { "vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr) },
4575 { "vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance) },
4576 { "vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance) },
4577 { "vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice) },
4578 { "vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices) },
4579 { "vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties) },
4580 { "vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures) },
4581 { "vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties) },
4582 { "vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties) },
4583 { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties) },
4584 { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties) },
4585 { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties) },
Chia-I Wub02600c2016-05-20 07:11:22 +08004586 { "vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties) },
4587 { "vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties) },
4588 { "vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08004589 { "vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties) },
4590 };
4591
4592 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
4593 if (!strcmp(core_instance_commands[i].name, name))
4594 return core_instance_commands[i].proc;
4595 }
4596
4597 return nullptr;
4598}
4599
4600static PFN_vkVoidFunction
Chia-I Wuf9b01382016-05-16 07:37:41 +08004601intercept_core_device_command(const char *name) {
4602 static const struct {
4603 const char *name;
4604 PFN_vkVoidFunction proc;
4605 } core_device_commands[] = {
4606 { "vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr) },
4607 { "vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice) },
4608 { "vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue) },
4609 { "vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit) },
4610 { "vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle) },
4611 { "vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle) },
4612 { "vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory) },
4613 { "vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory) },
4614 { "vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory) },
4615 { "vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory) },
4616 { "vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges) },
4617 { "vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges) },
4618 { "vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment) },
4619 { "vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory) },
4620 { "vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory) },
4621 { "vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence) },
4622 { "vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence) },
4623 { "vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences) },
4624 { "vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus) },
4625 { "vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences) },
4626 { "vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore) },
4627 { "vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore) },
4628 { "vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent) },
4629 { "vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent) },
4630 { "vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus) },
4631 { "vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent) },
4632 { "vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent) },
4633 { "vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool) },
4634 { "vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool) },
4635 { "vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults) },
4636 { "vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer) },
4637 { "vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer) },
4638 { "vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView) },
4639 { "vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView) },
4640 { "vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage) },
4641 { "vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage) },
4642 { "vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout) },
4643 { "vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView) },
4644 { "vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView) },
4645 { "vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule) },
4646 { "vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule) },
4647 { "vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache) },
4648 { "vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache) },
4649 { "vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData) },
4650 { "vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches) },
4651 { "vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines) },
4652 { "vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines) },
4653 { "vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline) },
4654 { "vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout) },
4655 { "vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout) },
4656 { "vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler) },
4657 { "vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler) },
4658 { "vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout) },
4659 { "vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout) },
4660 { "vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool) },
4661 { "vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool) },
4662 { "vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool) },
4663 { "vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets) },
4664 { "vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets) },
4665 { "vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets) },
4666 { "vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport) },
4667 { "vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor) },
4668 { "vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth) },
4669 { "vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias) },
4670 { "vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants) },
4671 { "vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds) },
4672 { "vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask) },
4673 { "vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask) },
4674 { "vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference) },
4675 { "vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers) },
4676 { "vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers) },
4677 { "vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer) },
4678 { "vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer) },
4679 { "vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer) },
4680 { "vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline) },
4681 { "vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets) },
4682 { "vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers) },
4683 { "vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer) },
4684 { "vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw) },
4685 { "vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed) },
4686 { "vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect) },
4687 { "vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect) },
4688 { "vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch) },
4689 { "vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect) },
4690 { "vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer) },
4691 { "vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage) },
4692 { "vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage) },
4693 { "vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage) },
4694 { "vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer) },
4695 { "vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer) },
4696 { "vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer) },
4697 { "vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage) },
4698 { "vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage) },
4699 { "vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent) },
4700 { "vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent) },
4701 { "vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents) },
4702 { "vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier) },
4703 { "vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery) },
4704 { "vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery) },
4705 { "vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool) },
4706 { "vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp) },
4707 { "vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults) },
4708 { "vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer) },
4709 { "vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer) },
4710 { "vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass) },
4711 { "vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass) },
4712 { "vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity) },
4713 { "vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool) },
4714 { "vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool) },
4715 { "vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool) },
4716 { "vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass) },
4717 { "vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass) },
4718 };
4719
4720 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
4721 if (!strcmp(core_device_commands[i].name, name))
4722 return core_device_commands[i].proc;
4723 }
4724
4725 return nullptr;
4726}
4727
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004728} // namespace parameter_validation
4729
4730// vk_layer_logging.h expects these to be defined
4731
4732VKAPI_ATTR VkResult VKAPI_CALL
4733vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4734 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004735 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004736}
4737
4738VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
4739 VkDebugReportCallbackEXT msgCallback,
4740 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004741 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004742}
4743
4744VKAPI_ATTR void VKAPI_CALL
4745vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
4746 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004747 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004748}
4749
4750// loader-layer interface v0
4751
Chia-I Wu99f701c2016-05-13 14:06:08 +08004752VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4753vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004754 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004755}
4756
4757VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4758vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004759 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004760}
4761
4762VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4763vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004764 // the layer command handles VK_NULL_HANDLE just fine internally
4765 assert(physicalDevice == VK_NULL_HANDLE);
4766 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004767}
4768
4769VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4770 const char *pLayerName, uint32_t *pCount,
4771 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004772 // the layer command handles VK_NULL_HANDLE just fine internally
4773 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08004774 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004775}
4776
4777VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004778 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08004779}
4780
4781VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08004782 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004783}