blob: 77c266f4498936574405233d0ef22e38389af27f [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 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials
11 * are furnished to do so, subject to the following conditions:
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060012 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070013 * The above copyright notice(s) and this permission notice shall be included
14 * in all copies or substantial portions of the Materials.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060015 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070016 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 *
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
23 * USE OR OTHER DEALINGS IN THE MATERIALS
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060024 *
25 * Author: Jeremy Hayes <jeremy@lunarg.com>
26 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070027 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070028 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060029 */
30
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include <iostream>
36#include <string>
37#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050038#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060039#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060040#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060041
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060042#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070043#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060045#include "vk_enum_validate_helper.h"
46#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060047
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060048#include "vk_layer_table.h"
49#include "vk_layer_data.h"
50#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060051#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070052#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060053
Dustin Graves1e92cd72016-02-09 14:00:18 -070054#include "param_check.h"
55
Cody Northrop55443ef2015-09-28 15:09:32 -060056struct layer_data {
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
Jon Ashburn5484e0c2016-03-08 17:48:44 -070060 // TODO: Split instance/device structs
61 // Device Data
62 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060063 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
64
Jon Ashburn5484e0c2016-03-08 17:48:44 -070065 layer_data() : report_data(nullptr){};
Cody Northrop55443ef2015-09-28 15:09:32 -060066};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050067
Jon Ashburn5484e0c2016-03-08 17:48:44 -070068static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060069static device_table_map pc_device_table_map;
70static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060071
Jeremy Hayes99a96322015-06-26 12:48:09 -060072// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070073debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060074 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060075 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060076#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070077 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060078#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060079 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060080
81 return data->report_data;
82}
83
84// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070085debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060086 dispatch_key key = get_dispatch_key(object);
87 layer_data *data = get_my_data_ptr(key, layer_data_map);
88#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070089 fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060090#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060091 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060092 return data->report_data;
93}
94
Mark Lobodzinski1079e1b2016-03-15 14:21:59 -060095static void init_param_checker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060096
Mark Lobodzinski1079e1b2016-03-15 14:21:59 -060097 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_param_checker");
Jeremy Hayes99a96322015-06-26 12:48:09 -060098}
99
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700100VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
101vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
102 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700103 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700104 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600105
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700106 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700107 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
108 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600109 }
110
111 return result;
112}
113
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700114VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
115 VkDebugReportCallbackEXT msgCallback,
116 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700117 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700118 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600119
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700120 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700121 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600122}
123
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700124VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
125vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
126 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700127 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
128 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700129}
130
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700131static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600132
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700133VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
134vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700135 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600136}
137
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700138static const VkLayerProperties pc_global_layers[] = {{
139 "VK_LAYER_LUNARG_param_checker", VK_API_VERSION, 1, "LunarG Validation Layer",
140}};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700141
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700142VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
143vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
144 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600145}
146
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700147VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
148 const char *pLayerName, uint32_t *pCount,
149 VkExtensionProperties *pProperties) {
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700150 /* param_checker does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700151 if (pLayerName == NULL) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152 return get_dispatch_table(pc_instance_table_map, physicalDevice)
153 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700154 } else {
155 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
156 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600157}
158
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700159VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
160vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700161
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700162 /* param_checker's physical device layers are the same as global */
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700163 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600164}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600165
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166static std::string EnumeratorString(VkResult const &enumerator) {
167 switch (enumerator) {
168 case VK_RESULT_MAX_ENUM: {
169 return "VK_RESULT_MAX_ENUM";
170 break;
171 }
172 case VK_ERROR_LAYER_NOT_PRESENT: {
173 return "VK_ERROR_LAYER_NOT_PRESENT";
174 break;
175 }
176 case VK_ERROR_INCOMPATIBLE_DRIVER: {
177 return "VK_ERROR_INCOMPATIBLE_DRIVER";
178 break;
179 }
180 case VK_ERROR_MEMORY_MAP_FAILED: {
181 return "VK_ERROR_MEMORY_MAP_FAILED";
182 break;
183 }
184 case VK_INCOMPLETE: {
185 return "VK_INCOMPLETE";
186 break;
187 }
188 case VK_ERROR_OUT_OF_HOST_MEMORY: {
189 return "VK_ERROR_OUT_OF_HOST_MEMORY";
190 break;
191 }
192 case VK_ERROR_INITIALIZATION_FAILED: {
193 return "VK_ERROR_INITIALIZATION_FAILED";
194 break;
195 }
196 case VK_NOT_READY: {
197 return "VK_NOT_READY";
198 break;
199 }
200 case VK_ERROR_OUT_OF_DEVICE_MEMORY: {
201 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
202 break;
203 }
204 case VK_EVENT_SET: {
205 return "VK_EVENT_SET";
206 break;
207 }
208 case VK_TIMEOUT: {
209 return "VK_TIMEOUT";
210 break;
211 }
212 case VK_EVENT_RESET: {
213 return "VK_EVENT_RESET";
214 break;
215 }
216 case VK_SUCCESS: {
217 return "VK_SUCCESS";
218 break;
219 }
220 case VK_ERROR_EXTENSION_NOT_PRESENT: {
221 return "VK_ERROR_EXTENSION_NOT_PRESENT";
222 break;
223 }
224 case VK_ERROR_DEVICE_LOST: {
225 return "VK_ERROR_DEVICE_LOST";
226 break;
227 }
228 default: {
229 return "unrecognized enumerator";
230 break;
231 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600232 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600233}
234
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700235static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600236 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
238 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
239 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
240 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
241 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 -0700242 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600244 return false;
245 }
246
247 return true;
248}
249
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700250static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
251 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 return "unrecognized enumerator";
253 }
254
255 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600257 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
258 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700259 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600260 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
261 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
264 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700265 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
267 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700268 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600269 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
270 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600272 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
273 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700274 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600275 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
276 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700277 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600278 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
279 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700280 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600281 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
282 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700283 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600284 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
285 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800287 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600288 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800290 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600291 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700293 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
294 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600295
296 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700297 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600298 enumeratorString += string;
299
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700300 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600301 enumeratorString += '|';
302 }
303 }
304
305 return enumeratorString;
306}
307
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700308static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
309 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
310 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
311 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
312 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
313 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600314 return false;
315 }
316
317 return true;
318}
319
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
321 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600322 return "unrecognized enumerator";
323 }
324
325 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600327 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
328 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700329 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600330 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600331 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600333 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
334 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700335 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600336 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
337 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700338 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600339 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
340 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700341 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800342 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600343 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700344 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600345 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
346 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800348 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600349 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600350
351 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700352 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600353 enumeratorString += string;
354
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700355 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600356 enumeratorString += '|';
357 }
358 }
359
360 return enumeratorString;
361}
362
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700363static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
364 VkQueueFlagBits allFlags =
365 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
366 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600367 return false;
368 }
369
370 return true;
371}
372
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700373static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
374 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600375 return "unrecognized enumerator";
376 }
377
378 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700379 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800380 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600381 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700382 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600383 strings.push_back("VK_QUEUE_COMPUTE_BIT");
384 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700385 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800386 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600387 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700388 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600389 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
390 }
391
392 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700393 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600394 enumeratorString += string;
395
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600397 enumeratorString += '|';
398 }
399 }
400
401 return enumeratorString;
402}
403
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
405 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
406 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
407 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
408 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600409 return false;
410 }
411
412 return true;
413}
414
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700415static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
416 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600417 return "unrecognized enumerator";
418 }
419
420 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
423 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700424 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800425 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600426 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600428 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
429 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700430 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800431 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600432 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700433 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800434 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600435 }
436
437 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600439 enumeratorString += string;
440
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700441 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600442 enumeratorString += '|';
443 }
444 }
445
446 return enumeratorString;
447}
448
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700449static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700450 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700451 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600452 return false;
453 }
454
455 return true;
456}
457
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
459 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600460 return "unrecognized enumerator";
461 }
462
463 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700464 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800465 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600466 }
467
468 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700469 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600470 enumeratorString += string;
471
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700472 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600473 enumeratorString += '|';
474 }
475 }
476
477 return enumeratorString;
478}
479
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
481 VkSparseImageFormatFlagBits allFlags =
482 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
483 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
484 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600486 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487
488 return true;
489}
490
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
492 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600494 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495
496 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800498 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800501 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600502 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800504 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600505 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600506
507 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700508 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600509 enumeratorString += string;
510
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700511 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600512 enumeratorString += '|';
513 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600514 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515
516 return enumeratorString;
517}
518
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700519static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700520 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700521 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600522 return false;
523 }
524
525 return true;
526}
527
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700528static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
529 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600530 return "unrecognized enumerator";
531 }
532
533 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700534 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600535 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
536 }
537
538 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700539 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 enumeratorString += string;
541
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700542 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600543 enumeratorString += '|';
544 }
545 }
546
547 return enumeratorString;
548}
549
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
551 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
552 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
553 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
554 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
555 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600556 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
557 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
558 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700559 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600560 return false;
561 }
562
563 return true;
564}
565
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700566static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
567 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600568 return "unrecognized enumerator";
569 }
570
571 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700572 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700573 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600574 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700576 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600577 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700579 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600580 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700581 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700582 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600583 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700584 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700585 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600586 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700588 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600589 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700591 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600592 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700594 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700597 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700600 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600601 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700603 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600604 }
605
606 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600608 enumeratorString += string;
609
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700610 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600611 enumeratorString += '|';
612 }
613 }
614
615 return enumeratorString;
616}
617
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700618static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
619 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
620 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
621 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600622 return false;
623 }
624
625 return true;
626}
627
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700628static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
629 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600630 return "unrecognized enumerator";
631 }
632
633 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700634 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600635 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
636 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700637 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600638 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
639 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700640 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600641 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
642 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600644 strings.push_back("VK_QUERY_RESULT_64_BIT");
645 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600646
647 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700648 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600649 enumeratorString += string;
650
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700651 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600652 enumeratorString += '|';
653 }
654 }
655
656 return enumeratorString;
657}
658
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700659static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
660 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
661 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
662 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
663 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
664 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600665 return false;
666 }
667
668 return true;
669}
670
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
672 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600673 return "unrecognized enumerator";
674 }
675
676 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
679 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700680 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600681 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
682 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700683 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600684 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
685 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700686 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600687 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
688 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700689 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600690 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
691 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700692 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800693 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600694 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700695 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600696 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
697 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700698 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800699 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700701 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600702 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
703 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600704
705 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700706 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600707 enumeratorString += string;
708
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700709 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 enumeratorString += '|';
711 }
712 }
713
714 return enumeratorString;
715}
716
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700717static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
718 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
719 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
720 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600721 return false;
722 }
723
724 return true;
725}
726
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700727static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
728 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600729 return "unrecognized enumerator";
730 }
731
732 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700733 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600734 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
735 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700736 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600737 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
738 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700739 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600740 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600741 }
742
743 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700744 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600745 enumeratorString += string;
746
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700747 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600748 enumeratorString += '|';
749 }
750 }
751
752 return enumeratorString;
753}
754
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700755static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
756 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
757 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
758 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
759 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600760 return false;
761 }
762
763 return true;
764}
765
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700766static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
767 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600768 return "unrecognized enumerator";
769 }
770
771 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700772 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600773 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
774 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700775 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600776 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
777 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700778 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600779 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
780 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700781 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600782 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
783 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700784 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600785 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600786 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600787
788 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600790 enumeratorString += string;
791
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600793 enumeratorString += '|';
794 }
795 }
796
797 return enumeratorString;
798}
799
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700800static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
801 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
802 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
803 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600804 return false;
805 }
806
807 return true;
808}
809
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700810static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
811 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600812 return "unrecognized enumerator";
813 }
814
815 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700816 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800817 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600818 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700819 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800820 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600821 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700822 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800823 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600824 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700825 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800826 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600827 }
828
829 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700830 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600831 enumeratorString += string;
832
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700833 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600834 enumeratorString += '|';
835 }
836 }
837
838 return enumeratorString;
839}
840
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700841static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
842 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
843 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
844 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600845 return false;
846 }
847
848 return true;
849}
850
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
852 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 return "unrecognized enumerator";
854 }
855
856 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600858 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
859 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600861 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
862 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600864 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 }
866
867 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600869 enumeratorString += string;
870
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600872 enumeratorString += '|';
873 }
874 }
875
876 return enumeratorString;
877}
878
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700879static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
880 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
881 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
882 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
883 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600884 return false;
885 }
886
887 return true;
888}
889
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
891 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600892 return "unrecognized enumerator";
893 }
894
895 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600898 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700899 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600900 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600901 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700902 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600903 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
904 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700905 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600906 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
907 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600909 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600910 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600912 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600913 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600915 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600916 }
917
918 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700919 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600920 enumeratorString += string;
921
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700922 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600923 enumeratorString += '|';
924 }
925 }
926
927 return enumeratorString;
928}
929
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700930static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800931 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700932 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
933 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
934 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
935 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
936 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
937 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 -0700938 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700939 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600940 return false;
941 }
942
943 return true;
944}
945
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700946static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
947 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600948 return "unrecognized enumerator";
949 }
950
951 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700952 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800953 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
954 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700955 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800956 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600957 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700958 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600959 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600960 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700961 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600963 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700964 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600966 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700967 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700968 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600969 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700970 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600971 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600972 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700973 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600975 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700976 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600977 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600978 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700979 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600981 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700982 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600983 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
984 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700985 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600986 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
987 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700988 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700989 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600990 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700991 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600992 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
993 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700994 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600995 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
996 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700997 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600998 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
999 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001000 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001001 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001002 }
1003
1004 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001005 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001006 enumeratorString += string;
1007
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001009 enumeratorString += '|';
1010 }
1011 }
1012
1013 return enumeratorString;
1014}
1015
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001016static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +08001017 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
1019 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
1020 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
1021 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
1022 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 +08001023
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001024 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001025 return false;
1026 }
1027
1028 return true;
1029}
1030
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001031static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
1032 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001033 return "unrecognized enumerator";
1034 }
1035
1036 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001037 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001038 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001039 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001040 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001041 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001042 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001044 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001046 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001047 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001048 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001049 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001050 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001051 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001053 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001054 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001056 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001057 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001058 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001059 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001060 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001061 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001062 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001063 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001064 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001065 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001066 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001067 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001068 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001069 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001070 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001071 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001072 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001073 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001074 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001075 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001076 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001077 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001078 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001079 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001080 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001081 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001082 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001083 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001084 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001085 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001086 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001087 }
1088
1089 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001090 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001091 enumeratorString += string;
1092
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001093 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001094 enumeratorString += '|';
1095 }
1096 }
1097
1098 return enumeratorString;
1099}
1100
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001101static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1102 VkCommandPoolCreateFlagBits allFlags =
1103 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1104 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001105 return false;
1106 }
1107
1108 return true;
1109}
1110
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001111static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1112 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001113 return "unrecognized enumerator";
1114 }
1115
1116 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001117 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001118 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001119 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001120 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001121 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001122 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001123
1124 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001126 enumeratorString += string;
1127
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001128 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001129 enumeratorString += '|';
1130 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001131 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001132
1133 return enumeratorString;
1134}
1135
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001136static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001137 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001138 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001139 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001140 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001141
1142 return true;
1143}
1144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1146 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001147 return "unrecognized enumerator";
1148 }
1149
1150 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001151 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001152 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001153 }
1154
1155 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001156 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001157 enumeratorString += string;
1158
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001159 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001160 enumeratorString += '|';
1161 }
1162 }
1163
1164 return enumeratorString;
1165}
1166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001167static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1168 VkCommandBufferUsageFlags allFlags =
1169 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1170 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1171 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001172 return false;
1173 }
1174
1175 return true;
1176}
1177
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001178static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1179 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001180 return "unrecognized enumerator";
1181 }
1182
1183 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001184 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001185 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001187 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001188 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001190 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001191 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001192 }
1193
1194 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001195 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001196 enumeratorString += string;
1197
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001198 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001199 enumeratorString += '|';
1200 }
1201 }
1202
1203 return enumeratorString;
1204}
1205
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001206static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001207 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001208 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001209 return false;
1210 }
1211
1212 return true;
1213}
1214
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001215static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1216 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001217 return "unrecognized enumerator";
1218 }
1219
1220 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001221 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001222 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001223 }
1224
1225 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001226 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001227 enumeratorString += string;
1228
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001229 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001230 enumeratorString += '|';
1231 }
1232 }
1233
1234 return enumeratorString;
1235}
1236
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001237static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1238 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1239 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1240 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001241 return false;
1242 }
1243
1244 return true;
1245}
1246
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001247static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1248 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001249 return "unrecognized enumerator";
1250 }
1251
1252 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001253 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001254 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1255 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001256 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001257 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1258 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001259 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001260 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1261 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001262 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001263 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1264 }
1265
1266 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001267 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001268 enumeratorString += string;
1269
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001270 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001271 enumeratorString += '|';
1272 }
1273 }
1274
1275 return enumeratorString;
1276}
1277
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001278static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001279 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001280 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001281 return false;
1282 }
1283
1284 return true;
1285}
1286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001287static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1288 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001289 return "unrecognized enumerator";
1290 }
1291
1292 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001293 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001294 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001295 }
1296
1297 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001298 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001299 enumeratorString += string;
1300
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001301 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001302 enumeratorString += '|';
1303 }
1304 }
1305
1306 return enumeratorString;
1307}
1308
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001309static const int MaxParamCheckerStringLength = 256;
1310
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001311static VkBool32 validate_string(layer_data *my_data, const char *apiName, const char *stringName, const char *validateString) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001312 VkBool32 skipCall = VK_FALSE;
1313
1314 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1315
1316 if (result == VK_STRING_ERROR_NONE) {
1317 return skipCall;
1318 } else if (result & VK_STRING_ERROR_LENGTH) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001319 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1320 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001321 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001322 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1323 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001324 }
1325 return skipCall;
1326}
1327
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001328VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1329vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001330 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001331
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001332 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Graves842621d2016-03-03 14:17:08 -07001333 assert(chain_info->u.pLayerInfo);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001334 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1335 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001336 if (fpCreateInstance == NULL) {
1337 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001338 }
1339
Dustin Graves842621d2016-03-03 14:17:08 -07001340 // Advance the link info for the next element on the chain
1341 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1342
1343 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
1344 if (result != VK_SUCCESS) {
1345 return result;
1346 }
1347
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001348 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1349 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001350
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001351 my_data->report_data =
1352 debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001353
Mark Lobodzinski1079e1b2016-03-15 14:21:59 -06001354 init_param_checker(my_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001355
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001356 // Ordinarily we'd check these before calling down the chain, but none of the layer
1357 // support is in place until now, if we survive we can report the issue now.
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001358 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001359
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001360 param_check_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001361
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001362 if (pCreateInfo->pApplicationInfo) {
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001363 if (pCreateInfo->pApplicationInfo->pApplicationName) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001364 validate_string(my_instance_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pApplicationName",
1365 pCreateInfo->pApplicationInfo->pApplicationName);
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001366 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001367
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001368 if (pCreateInfo->pApplicationInfo->pEngineName) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001369 validate_string(my_instance_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pEngineName",
1370 pCreateInfo->pApplicationInfo->pEngineName);
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001371 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001372 }
1373
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001374 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001375}
1376
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001377VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001378 // Grab the key before the instance is destroyed.
1379 dispatch_key key = get_dispatch_key(instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001380 VkBool32 skipCall = VK_FALSE;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001381 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001382 assert(my_data != NULL);
1383
1384 skipCall |= param_check_vkDestroyInstance(my_data->report_data, pAllocator);
1385
1386 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001387 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001388 pTable->DestroyInstance(instance, pAllocator);
1389
1390 // Clean up logging callback, if any
1391 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001392 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1393 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001394 my_data->logging_callback.pop_back();
1395 }
1396
1397 layer_debug_report_destroy_instance(mid(instance));
1398 layer_data_map.erase(pTable);
1399
1400 pc_instance_table_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001401 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001402}
1403
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001404bool PostEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices,
1405 VkResult result) {
1406 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001407 std::string reason = "vkEnumeratePhysicalDevices parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408 log_msg(mid(instance), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1409 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001410 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001411 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001412
1413 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001414}
1415
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001416VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1417vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1418 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1419 VkBool32 skipCall = VK_FALSE;
1420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001421 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001422
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001423 skipCall |= param_check_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001424
1425 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001426 result = get_dispatch_table(pc_instance_table_map, instance)
1427 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001428
1429 PostEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices, result);
1430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001431
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001432 return result;
1433}
1434
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001435VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1436vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1437 VkBool32 skipCall = VK_FALSE;
1438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001439 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001440
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001441 skipCall |= param_check_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001442
1443 if (skipCall == VK_FALSE) {
1444 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001445 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001446}
1447
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001448bool PostGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1449 VkFormatProperties *pFormatProperties) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001450
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001451 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001452 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001453 "vkGetPhysicalDeviceFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001454 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001455 }
1456
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001457 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001458}
1459
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001460VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1461vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
1462 VkBool32 skipCall = VK_FALSE;
1463 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001465
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001466 skipCall |= param_check_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001467
1468 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001469 get_dispatch_table(pc_instance_table_map, physicalDevice)
1470 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471
1472 PostGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
1473 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001474}
1475
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001476bool PostGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1477 VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
1478 VkImageFormatProperties *pImageFormatProperties, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001479
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001480 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001481 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001482 "vkGetPhysicalDeviceImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001483 return false;
1484 }
1485
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001486 if (type < VK_IMAGE_TYPE_BEGIN_RANGE || type > VK_IMAGE_TYPE_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001487 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001488 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001489 return false;
1490 }
1491
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001492 if (tiling < VK_IMAGE_TILING_BEGIN_RANGE || tiling > VK_IMAGE_TILING_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001493 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001494 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001495 return false;
1496 }
1497
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001498 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001499 std::string reason = "vkGetPhysicalDeviceImageFormatProperties parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001500 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1501 "%s", reason.c_str());
Chia-I Wu17241042015-10-31 00:31:16 +08001502 return false;
1503 }
1504
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001505 return true;
1506}
1507
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001508VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1509vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1510 VkImageUsageFlags usage, VkImageCreateFlags flags,
1511 VkImageFormatProperties *pImageFormatProperties) {
1512 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1513 VkBool32 skipCall = VK_FALSE;
1514 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001515 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001516
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001517 skipCall |= param_check_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
1518 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001519
1520 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001521 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1522 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1523 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001524
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001525 PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties,
1526 result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001527 }
Chia-I Wu17241042015-10-31 00:31:16 +08001528
1529 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001530}
1531
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001532bool PostGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001533
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001534 if (pProperties != nullptr) {
1535 if (pProperties->deviceType < VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE ||
1536 pProperties->deviceType > VK_PHYSICAL_DEVICE_TYPE_END_RANGE) {
1537 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1538 "vkGetPhysicalDeviceProperties parameter, VkPhysicalDeviceType pProperties->deviceType, is an unrecognized "
1539 "enumerator");
1540 return false;
1541 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001542 }
1543
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001544 return true;
1545}
1546
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001547VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1548vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1549 VkBool32 skipCall = VK_FALSE;
1550 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001551 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001552
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001553 skipCall |= param_check_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001554
1555 if (skipCall == VK_FALSE) {
1556 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
1557
1558 PostGetPhysicalDeviceProperties(physicalDevice, pProperties);
1559 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001560}
1561
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001562VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1563vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1564 VkQueueFamilyProperties *pQueueFamilyProperties) {
1565 VkBool32 skipCall = VK_FALSE;
1566 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001567 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001568
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001569 skipCall |= param_check_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1570 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001571
1572 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001573 get_dispatch_table(pc_instance_table_map, physicalDevice)
1574 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001575 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001576}
1577
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001578VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1579vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1580 VkBool32 skipCall = VK_FALSE;
1581 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001582 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001583
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001584 skipCall |= param_check_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001585
1586 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001587 get_dispatch_table(pc_instance_table_map, physicalDevice)
1588 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001589 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001590}
1591
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001592void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1593 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001594 std::unordered_set<uint32_t> set;
1595 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1596 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001597 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001598 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1599 "structure.",
1600 i);
Michael Lentine157a2ec2016-01-27 11:25:05 -06001601 } else {
1602 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
1603 }
Michael Lentine26244832016-01-27 11:40:27 -06001604 if (pCreateInfo->pQueueCreateInfos[i].queueCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001605 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001606 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount, cannot be zero.", i);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001607 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001608 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001609 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f ||
1610 pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f) {
1611 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1612 "PARAMCHECK", "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1613 "between 0 and 1. Actual value is %f",
1614 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001615 }
Michael Lentine26244832016-01-27 11:40:27 -06001616 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001617 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1618 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001619 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1620 "of queue families.",
1621 i);
1622 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1623 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001624 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001625 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1626 "queues for the given family index.",
1627 i);
Michael Lentine774704f2016-01-27 13:36:46 -06001628 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001629 }
1630}
1631
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001632void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001633 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001634 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1635 my_device_data->queueFamilyIndexMap.insert(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001636 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
Michael Lentinebdf744f2016-01-27 15:43:43 -06001637 }
1638}
1639
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001640VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1641 const VkDeviceCreateInfo *pCreateInfo,
1642 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001643 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001644 * NOTE: We do not validate physicalDevice or any dispatchable
1645 * object as the first parameter. We couldn't get here if it was wrong!
1646 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001647
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001648 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1649 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001650 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001651
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001652 skipCall |= param_check_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001653
Dustin Graves1e92cd72016-02-09 14:00:18 -07001654 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
1655 for (auto i = 0; i < pCreateInfo->enabledLayerCount; i++) {
1656 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledLayerNames",
1657 pCreateInfo->ppEnabledLayerNames[i]);
1658 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001659 }
Michael Lentine774704f2016-01-27 13:36:46 -06001660
Dustin Graves1e92cd72016-02-09 14:00:18 -07001661 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
1662 for (auto i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1663 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledExtensionNames",
1664 pCreateInfo->ppEnabledExtensionNames[i]);
1665 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001666 }
1667
1668 if (skipCall == VK_FALSE) {
1669 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
1670 assert(chain_info->u.pLayerInfo);
1671 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1672 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001673 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001674 if (fpCreateDevice == NULL) {
1675 return VK_ERROR_INITIALIZATION_FAILED;
1676 }
1677
1678 // Advance the link info for the next element on the chain
1679 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1680
1681 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
1682 if (result != VK_SUCCESS) {
1683 return result;
1684 }
1685
1686 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1687 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1688 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1689
1690 uint32_t count;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001691 get_dispatch_table(pc_instance_table_map, physicalDevice)
1692 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001693 std::vector<VkQueueFamilyProperties> properties(count);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001694 get_dispatch_table(pc_instance_table_map, physicalDevice)
1695 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001696
1697 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1698 storeCreateDeviceData(*pDevice, pCreateInfo);
1699 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001700
Jeremy Hayes99a96322015-06-26 12:48:09 -06001701 return result;
1702}
1703
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001704VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001705 dispatch_key key = get_dispatch_key(device);
Dustin Graves27a912a2016-03-07 17:52:14 -07001706 VkBool32 skipCall = VK_FALSE;
1707 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1708 assert(my_data != NULL);
1709
1710 skipCall |= param_check_vkDestroyDevice(my_data->report_data, pAllocator);
1711
1712 if (skipCall == VK_FALSE) {
1713 layer_debug_report_destroy_device(device);
1714
Jeremy Hayes99a96322015-06-26 12:48:09 -06001715#if DISPATCH_MAP_DEBUG
Dustin Graves27a912a2016-03-07 17:52:14 -07001716 fprintf(stderr, "Device: %p, key: %p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001717#endif
1718
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001719 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001720 pc_device_table_map.erase(key);
1721 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001722}
1723
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001724bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001725 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1726 auto queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001727 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001728 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001729 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.",
1730 queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001731 return false;
1732 }
1733 if (queue_data->second <= queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001734 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001735 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1736 "was created.",
1737 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001738 return false;
1739 }
1740 return true;
1741}
1742
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001743VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1744vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1745 VkBool32 skipCall = VK_FALSE;
1746 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001747 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001748
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001749 skipCall |= param_check_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001750
Dustin Graves1e92cd72016-02-09 14:00:18 -07001751 if (skipCall == VK_FALSE) {
1752 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1753
1754 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001755 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001756}
1757
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001758bool PostQueueSubmit(VkQueue queue, uint32_t commandBufferCount, VkFence fence, VkResult result) {
1759 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001760 std::string reason = "vkQueueSubmit parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001761 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1762 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001763 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001765
1766 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001767}
1768
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1770vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1771 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1772 VkBool32 skipCall = VK_FALSE;
1773 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001774 assert(my_data != NULL);
1775
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001776 skipCall |= param_check_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001777
1778 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001779 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1780
1781 PostQueueSubmit(queue, submitCount, fence, result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001782 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001783
Jeremy Hayes99a96322015-06-26 12:48:09 -06001784 return result;
1785}
1786
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001787bool PostQueueWaitIdle(VkQueue queue, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001788
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001789 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001790 std::string reason = "vkQueueWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001791 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1792 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001793 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001794 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001795
1796 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001797}
1798
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001799VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001800 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001801
1802 PostQueueWaitIdle(queue, result);
1803
1804 return result;
1805}
1806
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001807bool PostDeviceWaitIdle(VkDevice device, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001808
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001809 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001810 std::string reason = "vkDeviceWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1812 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001813 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001814 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001815
1816 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817}
1818
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001819VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001820 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
1822 PostDeviceWaitIdle(device, result);
1823
1824 return result;
1825}
1826
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001827bool PostAllocateMemory(VkDevice device, VkDeviceMemory *pMemory, VkResult result) {
1828 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001829 std::string reason = "vkAllocateMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001830 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1831 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001832 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001833 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001834
1835 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001836}
1837
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001838VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1839 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1840 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1841 VkBool32 skipCall = VK_FALSE;
1842 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001843 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001844
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001845 skipCall |= param_check_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001846
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001848 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1849
1850 PostAllocateMemory(device, pMemory, result);
1851 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001852
1853 return result;
1854}
1855
Dustin Graves27a912a2016-03-07 17:52:14 -07001856VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001857vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001858 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001860 assert(my_data != NULL);
1861
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001862 skipCall |= param_check_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001863
1864 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001865 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001866 }
1867}
1868
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001869bool PostMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags,
1870 void **ppData, VkResult result) {
1871 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001872 std::string reason = "vkMapMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001873 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1874 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001875 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001876 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001877
1878 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001879}
1880
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001881VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1882vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1883 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1884 VkBool32 skipCall = VK_FALSE;
1885 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001886 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001887
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001888 skipCall |= param_check_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001889
1890 if (skipCall == VK_FALSE) {
1891 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1892
1893 PostMapMemory(device, memory, offset, size, flags, ppData, result);
1894 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001895
1896 return result;
1897}
1898
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001899bool PostFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001900
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001901 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001902 std::string reason = "vkFlushMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001903 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1904 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001905 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001906 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001907
1908 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001909}
1910
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001911VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1912vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1913 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1914 VkBool32 skipCall = VK_FALSE;
1915 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001916 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001917
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001918 skipCall |= param_check_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001919
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001921 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1922
1923 PostFlushMappedMemoryRanges(device, memoryRangeCount, result);
1924 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001925
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001926 return result;
1927}
1928
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001929bool PostInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001930
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001931 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001932 std::string reason = "vkInvalidateMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001933 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1934 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001935 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001936 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001937
1938 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001939}
1940
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001941VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1942vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1943 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1944 VkBool32 skipCall = VK_FALSE;
1945 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001946 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001947
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001948 skipCall |= param_check_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001949
Dustin Graves1e92cd72016-02-09 14:00:18 -07001950 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001951 result =
1952 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001953
1954 PostInvalidateMappedMemoryRanges(device, memoryRangeCount, result);
1955 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001956
Tony Barbourb1250542015-04-16 19:23:13 -06001957 return result;
1958}
1959
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001960VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1961vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
1962 VkBool32 skipCall = VK_FALSE;
1963 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001964 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001965
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001966 skipCall |= param_check_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001967
1968 if (skipCall == VK_FALSE) {
1969 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001970 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001971}
1972
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001973bool PostBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001974
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001975 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001976 std::string reason = "vkBindBufferMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1978 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001979 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001980 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001981
1982 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001983}
1984
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001985VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1986vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001987 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, mem, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001988
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001989 PostBindBufferMemory(device, buffer, mem, memoryOffset, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001990
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001991 return result;
1992}
1993
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001994bool PostBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memoryOffset, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001995
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001997 std::string reason = "vkBindImageMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001998 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1999 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002000 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002001 }
2002
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002003 return true;
2004}
2005
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2007vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002008 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, mem, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002009
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002010 PostBindImageMemory(device, image, mem, memoryOffset, result);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002011
2012 return result;
2013}
2014
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002015VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2016vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
2017 VkBool32 skipCall = VK_FALSE;
2018 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002021 skipCall |= param_check_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002022
2023 if (skipCall == VK_FALSE) {
2024 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002025 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002026}
2027
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002028VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2029vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
2030 VkBool32 skipCall = VK_FALSE;
2031 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002032 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002033
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034 skipCall |= param_check_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002035
2036 if (skipCall == VK_FALSE) {
2037 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002038 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002039}
2040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002041bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2042 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2043 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002044 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002045 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2046 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002047 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002048 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2049 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002050 return false;
2051 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002052 }
2053
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002054 return true;
2055}
2056
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002057VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2058vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2059 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2060 VkBool32 skipCall = VK_FALSE;
2061 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002062 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002063
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002064 skipCall |= param_check_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2065 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002066
2067 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002068 get_dispatch_table(pc_device_table_map, device)
2069 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002070
2071 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2072 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002073}
2074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002075bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2076 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2077 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002078
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002079 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002080 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002081 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002082 return false;
2083 }
2084
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002085 if (type < VK_IMAGE_TYPE_BEGIN_RANGE || type > VK_IMAGE_TYPE_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002086 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002087 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002088 return false;
2089 }
2090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002091 if (tiling < VK_IMAGE_TILING_BEGIN_RANGE || tiling > VK_IMAGE_TILING_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002092 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002093 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002094 return false;
2095 }
2096
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002097 if (pProperties != nullptr) {
2098 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2099 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002100 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002101 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2102 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002103 return false;
2104 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002105 }
2106
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002107 return true;
2108}
2109
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002110VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2111vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2112 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2113 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
2114 VkBool32 skipCall = VK_FALSE;
2115 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002116 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002117
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002118 skipCall |= param_check_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
2119 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002120
2121 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002122 get_dispatch_table(pc_instance_table_map, physicalDevice)
2123 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2124 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002125
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002126 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2127 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002128 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002129}
2130
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002131bool PostQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002133 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002134 std::string reason = "vkQueueBindSparse parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002135 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2136 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002137 return false;
2138 }
2139
2140 return true;
2141}
2142
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002143VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2144vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
2145 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2146 VkBool32 skipCall = VK_FALSE;
2147 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002148 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002149
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002150 skipCall |= param_check_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002151
Dustin Graves1e92cd72016-02-09 14:00:18 -07002152 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002153 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2154
2155 PostQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
2156 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002157
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002158 return result;
2159}
2160
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002161bool PostCreateFence(VkDevice device, VkFence *pFence, VkResult result) {
2162 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002163 std::string reason = "vkCreateFence parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002164 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2165 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002166 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002167 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002168
2169 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170}
2171
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002172VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2173vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2174 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2175 VkBool32 skipCall = VK_FALSE;
2176 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002177 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002178
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002179 skipCall |= param_check_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002180
Dustin Graves1e92cd72016-02-09 14:00:18 -07002181 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002182 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2183
2184 PostCreateFence(device, pFence, result);
2185 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002186
2187 return result;
2188}
2189
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002190VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002191 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002192 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002193 assert(my_data != NULL);
2194
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002195 skipCall |= param_check_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002196
2197 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002198 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002199 }
2200}
2201
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002202bool PostResetFences(VkDevice device, uint32_t fenceCount, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002203
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002204 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002205 std::string reason = "vkResetFences parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002206 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2207 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002208 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002209 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002210
2211 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002212}
2213
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002214VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2215 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2216 VkBool32 skipCall = VK_FALSE;
2217 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002218 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002220 skipCall |= param_check_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002221
Dustin Graves1e92cd72016-02-09 14:00:18 -07002222 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002223 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2224
2225 PostResetFences(device, fenceCount, result);
2226 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002227
2228 return result;
2229}
2230
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002231bool PostGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002232
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002233 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002234 std::string reason = "vkGetFenceStatus parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002235 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2236 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002237 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002238 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002239
2240 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002241}
2242
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002243VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002244 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002245
2246 PostGetFenceStatus(device, fence, result);
2247
2248 return result;
2249}
2250
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002251bool PostWaitForFences(VkDevice device, uint32_t fenceCount, VkBool32 waitAll, uint64_t timeout, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002252
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002253 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002254 std::string reason = "vkWaitForFences parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002255 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2256 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002257 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002258 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002259
2260 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002261}
2262
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002263VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2264vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
2265 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2266 VkBool32 skipCall = VK_FALSE;
2267 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002268 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002269
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002270 skipCall |= param_check_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002271
Dustin Graves1e92cd72016-02-09 14:00:18 -07002272 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002273 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2274
2275 PostWaitForFences(device, fenceCount, waitAll, timeout, result);
2276 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002277
2278 return result;
2279}
2280
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002281bool PostCreateSemaphore(VkDevice device, VkSemaphore *pSemaphore, VkResult result) {
2282 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002283 std::string reason = "vkCreateSemaphore parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002284 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2285 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002286 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002287 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002288
2289 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002290}
2291
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002292VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2293 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2294 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2295 VkBool32 skipCall = VK_FALSE;
2296 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002297 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002298
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002299 skipCall |= param_check_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002300
Dustin Graves1e92cd72016-02-09 14:00:18 -07002301 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002302 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2303
2304 PostCreateSemaphore(device, pSemaphore, result);
2305 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002306
2307 return result;
2308}
2309
Dustin Graves27a912a2016-03-07 17:52:14 -07002310VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002311vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002312 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002313 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002314 assert(my_data != NULL);
2315
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002316 skipCall |= param_check_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002317
2318 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002319 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002320 }
2321}
2322
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002323bool PostCreateEvent(VkDevice device, VkEvent *pEvent, VkResult result) {
2324 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002325 std::string reason = "vkCreateEvent parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002326 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2327 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002328 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002329 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002330
2331 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002332}
2333
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002334VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2335vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2336 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2337 VkBool32 skipCall = VK_FALSE;
2338 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002339 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002340
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002341 skipCall |= param_check_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002342
Dustin Graves1e92cd72016-02-09 14:00:18 -07002343 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002344 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2345
2346 PostCreateEvent(device, pEvent, result);
2347 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002348
2349 return result;
2350}
2351
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002352VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002353 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002354 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002355 assert(my_data != NULL);
2356
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002357 skipCall |= param_check_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002358
2359 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002360 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002361 }
2362}
2363
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002364bool PostGetEventStatus(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002365
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002366 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002367 std::string reason = "vkGetEventStatus parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002368 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2369 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002370 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002371 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002372
2373 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002374}
2375
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002376VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002377 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002378
2379 PostGetEventStatus(device, event, result);
2380
2381 return result;
2382}
2383
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002384bool PostSetEvent(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002385
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002386 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002387 std::string reason = "vkSetEvent parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002388 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2389 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002390 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002391 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002392
2393 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002394}
2395
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002396VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002397 VkResult result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002398
2399 PostSetEvent(device, event, result);
2400
2401 return result;
2402}
2403
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002404bool PostResetEvent(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002405
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002406 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002407 std::string reason = "vkResetEvent parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002408 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2409 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002410 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002411 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002412
2413 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002414}
2415
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002416VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002417 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002418
2419 PostResetEvent(device, event, result);
2420
2421 return result;
2422}
2423
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002424bool PreCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo) {
2425 if (pCreateInfo != nullptr) {
2426 if (pCreateInfo->queryType < VK_QUERY_TYPE_BEGIN_RANGE || pCreateInfo->queryType > VK_QUERY_TYPE_END_RANGE) {
2427 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2428 "vkCreateQueryPool parameter, VkQueryType pCreateInfo->queryType, is an unrecognized enumerator");
2429 return false;
2430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002431 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002432
2433 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002434}
2435
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002436bool PostCreateQueryPool(VkDevice device, VkQueryPool *pQueryPool, VkResult result) {
2437 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002438 std::string reason = "vkCreateQueryPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002439 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2440 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002441 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002442 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002443
2444 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002445}
2446
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002447VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2448 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2449 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2450 VkBool32 skipCall = VK_FALSE;
2451 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002452 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002453
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002454 skipCall |= param_check_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002455
Dustin Graves1e92cd72016-02-09 14:00:18 -07002456 if (skipCall == VK_FALSE) {
2457 PreCreateQueryPool(device, pCreateInfo);
2458
2459 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2460
2461 PostCreateQueryPool(device, pQueryPool, result);
2462 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002463
2464 return result;
2465}
2466
Dustin Graves27a912a2016-03-07 17:52:14 -07002467VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002468vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002469 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002470 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002471 assert(my_data != NULL);
2472
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002473 skipCall |= param_check_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002474
2475 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002476 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002477 }
2478}
2479
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002480bool PostGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize,
2481 void *pData, VkDeviceSize stride, VkQueryResultFlags flags, VkResult result) {
2482 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002483 std::string reason = "vkGetQueryPoolResults parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002484 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2485 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002486 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002487 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002488
2489 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002490}
2491
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002492VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2493 uint32_t queryCount, size_t dataSize, void *pData,
2494 VkDeviceSize stride, VkQueryResultFlags flags) {
2495 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2496 VkBool32 skipCall = VK_FALSE;
2497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002498 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002499
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002500 skipCall |=
2501 param_check_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002502
2503 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002504 result = get_dispatch_table(pc_device_table_map, device)
2505 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002506
2507 PostGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags, result);
2508 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002509
2510 return result;
2511}
2512
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002513bool PreCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo) {
2514 if (pCreateInfo != nullptr) {
2515 if (pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE || pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE) {
2516 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2517 "vkCreateBuffer parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
2518 return false;
2519 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002520 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002521
2522 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002523}
2524
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002525bool PostCreateBuffer(VkDevice device, VkBuffer *pBuffer, VkResult result) {
2526 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002527 std::string reason = "vkCreateBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002528 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2529 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002530 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002531 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002532
2533 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002534}
2535
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002536VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2537vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2538 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2539 VkBool32 skipCall = VK_FALSE;
2540 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002541 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002542
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002543 skipCall |= param_check_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002544
Dustin Graves1e92cd72016-02-09 14:00:18 -07002545 if (skipCall == VK_FALSE) {
2546 PreCreateBuffer(device, pCreateInfo);
2547
2548 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2549
2550 PostCreateBuffer(device, pBuffer, result);
2551 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002552
2553 return result;
2554}
2555
Dustin Graves27a912a2016-03-07 17:52:14 -07002556VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002557vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002558 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002559 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002560 assert(my_data != NULL);
2561
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002562 skipCall |= param_check_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002563
2564 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002565 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002566 }
2567}
2568
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002569bool PreCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo) {
2570 if (pCreateInfo != nullptr) {
2571 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE || pCreateInfo->format > VK_FORMAT_END_RANGE) {
2572 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2573 "vkCreateBufferView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
2574 return false;
2575 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002576 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002577
2578 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002579}
2580
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002581bool PostCreateBufferView(VkDevice device, VkBufferView *pView, VkResult result) {
2582 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002583 std::string reason = "vkCreateBufferView parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002584 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2585 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002586 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002587 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002588
2589 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002590}
2591
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002592VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2593 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2594 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2595 VkBool32 skipCall = VK_FALSE;
2596 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);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002598
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002599 skipCall |= param_check_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002600
Dustin Graves1e92cd72016-02-09 14:00:18 -07002601 if (skipCall == VK_FALSE) {
2602 PreCreateBufferView(device, pCreateInfo);
2603
2604 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2605
2606 PostCreateBufferView(device, pView, result);
2607 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002608
2609 return result;
2610}
2611
Dustin Graves27a912a2016-03-07 17:52:14 -07002612VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002613vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002614 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002615 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002616 assert(my_data != NULL);
2617
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002618 skipCall |= param_check_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002619
2620 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002621 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002622 }
2623}
2624
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002625bool PreCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo) {
2626 if (pCreateInfo != nullptr) {
2627 if (pCreateInfo->imageType < VK_IMAGE_TYPE_BEGIN_RANGE || pCreateInfo->imageType > VK_IMAGE_TYPE_END_RANGE) {
2628 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2629 "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is an unrecognized enumerator");
2630 return false;
2631 }
2632 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE || pCreateInfo->format > VK_FORMAT_END_RANGE) {
2633 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2634 "vkCreateImage parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
2635 return false;
2636 }
2637 if (pCreateInfo->tiling < VK_IMAGE_TILING_BEGIN_RANGE || pCreateInfo->tiling > VK_IMAGE_TILING_END_RANGE) {
2638 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2639 "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is an unrecognized enumerator");
2640 return false;
2641 }
2642 if (pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE || pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE) {
2643 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2644 "vkCreateImage parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
2645 return false;
2646 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002647 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002648
2649 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002650}
2651
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002652bool PostCreateImage(VkDevice device, VkImage *pImage, VkResult result) {
2653 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002654 std::string reason = "vkCreateImage parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002655 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2656 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002657 return false;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002658 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002659
2660 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002661}
2662
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002663VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2664vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2665 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2666 VkBool32 skipCall = VK_FALSE;
2667 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002668 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002669
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002670 skipCall |= param_check_vkCreateImage(my_data->report_data, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002671
Dustin Graves1e92cd72016-02-09 14:00:18 -07002672 if (skipCall == VK_FALSE) {
2673 PreCreateImage(device, pCreateInfo);
2674
2675 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2676
2677 PostCreateImage(device, pImage, result);
2678 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002679
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002680 return result;
2681}
2682
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002683VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002684 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002685 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002686 assert(my_data != NULL);
2687
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 skipCall |= param_check_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002689
2690 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002691 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002692 }
2693}
2694
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002695bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2696 if (pSubresource != nullptr) {
2697 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2698 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
2699 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2700 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2701 return false;
2702 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002703 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002704
2705 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002706}
2707
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002708VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2709vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
2710 VkBool32 skipCall = VK_FALSE;
2711 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002712 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002713
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 skipCall |= param_check_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002715
Dustin Graves1e92cd72016-02-09 14:00:18 -07002716 if (skipCall == VK_FALSE) {
2717 PreGetImageSubresourceLayout(device, pSubresource);
2718
2719 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002720 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002721}
2722
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002723bool PreCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo) {
2724 if (pCreateInfo != nullptr) {
2725 if (pCreateInfo->viewType < VK_IMAGE_VIEW_TYPE_BEGIN_RANGE || pCreateInfo->viewType > VK_IMAGE_VIEW_TYPE_END_RANGE) {
2726 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2727 "vkCreateImageView parameter, VkImageViewType pCreateInfo->viewType, is an unrecognized enumerator");
2728 return false;
2729 }
2730 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE || pCreateInfo->format > VK_FORMAT_END_RANGE) {
2731 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2732 "vkCreateImageView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
2733 return false;
2734 }
2735 if (pCreateInfo->components.r < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2736 pCreateInfo->components.r > VK_COMPONENT_SWIZZLE_END_RANGE) {
2737 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2738 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.r, is an unrecognized enumerator");
2739 return false;
2740 }
2741 if (pCreateInfo->components.g < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2742 pCreateInfo->components.g > VK_COMPONENT_SWIZZLE_END_RANGE) {
2743 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2744 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.g, is an unrecognized enumerator");
2745 return false;
2746 }
2747 if (pCreateInfo->components.b < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2748 pCreateInfo->components.b > VK_COMPONENT_SWIZZLE_END_RANGE) {
2749 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2750 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.b, is an unrecognized enumerator");
2751 return false;
2752 }
2753 if (pCreateInfo->components.a < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2754 pCreateInfo->components.a > VK_COMPONENT_SWIZZLE_END_RANGE) {
2755 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2756 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.a, is an unrecognized enumerator");
2757 return false;
2758 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002759 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002760
2761 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002762}
2763
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764bool PostCreateImageView(VkDevice device, VkImageView *pView, VkResult result) {
2765 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002766 std::string reason = "vkCreateImageView parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002767 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2768 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002769 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002770 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002771
2772 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002773}
2774
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002775VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2776 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2777 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2778 VkBool32 skipCall = VK_FALSE;
2779 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002780 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002781
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 skipCall |= param_check_vkCreateImageView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002783
Dustin Graves1e92cd72016-02-09 14:00:18 -07002784 if (skipCall == VK_FALSE) {
2785 PreCreateImageView(device, pCreateInfo);
2786
2787 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2788
2789 PostCreateImageView(device, pView, result);
2790 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002791
2792 return result;
2793}
2794
Dustin Graves27a912a2016-03-07 17:52:14 -07002795VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002796vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002797 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002798 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002799 assert(my_data != NULL);
2800
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002801 skipCall |= param_check_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002802
2803 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002804 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002805 }
2806}
2807
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002808bool PostCreateShaderModule(VkDevice device, VkShaderModule *pShaderModule, VkResult result) {
2809 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002810 std::string reason = "vkCreateShaderModule parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002811 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2812 reason.c_str());
Michael Lentine03d8e572015-09-15 14:59:14 -05002813 return false;
2814 }
2815
2816 return true;
2817}
2818
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002819VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2820 const VkAllocationCallbacks *pAllocator,
2821 VkShaderModule *pShaderModule) {
2822 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2823 VkBool32 skipCall = VK_FALSE;
2824 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002825 assert(my_data != NULL);
2826
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002827 skipCall |= param_check_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002828
2829 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002830 result =
2831 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002832
2833 PostCreateShaderModule(device, pShaderModule, result);
2834 }
2835
Michael Lentine03d8e572015-09-15 14:59:14 -05002836 return result;
2837}
2838
Dustin Graves27a912a2016-03-07 17:52:14 -07002839VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002840vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002841 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002842 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002843 assert(my_data != NULL);
2844
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002845 skipCall |= param_check_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002846
2847 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002848 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002849 }
2850}
2851
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002852bool PostCreatePipelineCache(VkDevice device, VkPipelineCache *pPipelineCache, VkResult result) {
2853 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002854 std::string reason = "vkCreatePipelineCache parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002855 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2856 reason.c_str());
Tony Barbourdd6e32e2015-07-10 15:29:03 -06002857 return false;
2858 }
2859
2860 return true;
2861}
2862
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002863VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2864 const VkAllocationCallbacks *pAllocator,
2865 VkPipelineCache *pPipelineCache) {
2866 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2867 VkBool32 skipCall = VK_FALSE;
2868 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002869 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002870
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002871 skipCall |= param_check_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002872
Dustin Graves1e92cd72016-02-09 14:00:18 -07002873 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002874 result =
2875 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002876
2877 PostCreatePipelineCache(device, pPipelineCache, result);
2878 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002879
2880 return result;
2881}
2882
Dustin Graves27a912a2016-03-07 17:52:14 -07002883VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002884vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002885 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002886 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002887 assert(my_data != NULL);
2888
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002889 skipCall |= param_check_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002890
2891 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002892 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002893 }
2894}
2895
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002896bool PostGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData, VkResult result) {
2897 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002898 std::string reason = "vkGetPipelineCacheData parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002899 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2900 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002901 return false;
2902 }
2903
2904 return true;
2905}
2906
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002907VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2908vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2909 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2910 VkBool32 skipCall = VK_FALSE;
2911 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002912 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002913
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002914 skipCall |= param_check_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002915
2916 if (skipCall == VK_FALSE) {
2917 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2918
2919 PostGetPipelineCacheData(device, pipelineCache, pDataSize, pData, result);
2920 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002921
2922 return result;
2923}
2924
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002925bool PostMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002926
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002927 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002928 std::string reason = "vkMergePipelineCaches parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002929 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2930 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002931 return false;
2932 }
2933
2934 return true;
2935}
2936
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002937VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2938vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2939 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2940 VkBool32 skipCall = VK_FALSE;
2941 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002942 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002943
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002944 skipCall |= param_check_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002945
Dustin Graves1e92cd72016-02-09 14:00:18 -07002946 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002947 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2948
2949 PostMergePipelineCaches(device, dstCache, srcCacheCount, result);
2950 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002951
2952 return result;
2953}
2954
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002955bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002956 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2957
2958 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002959 if (pCreateInfos != nullptr) {
2960 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2961 if (pCreateInfos->basePipelineIndex != -1) {
2962 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2963 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2964 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2965 "pCreateInfos->flags "
2966 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2967 return false;
2968 }
2969 }
2970
2971 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2972 if (pCreateInfos->basePipelineIndex != -1) {
2973 log_msg(
2974 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2975 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2976 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2977 "VK_NULL_HANDLE");
2978 return false;
2979 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002980 }
2981 }
2982
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002983 if (pCreateInfos->pVertexInputState != nullptr) {
2984 if (pCreateInfos->pVertexInputState->pVertexBindingDescriptions != nullptr) {
2985 if (pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate < VK_VERTEX_INPUT_RATE_BEGIN_RANGE ||
2986 pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate > VK_VERTEX_INPUT_RATE_END_RANGE) {
2987 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2988 "vkCreateGraphicsPipelines parameter, VkVertexInputRate "
2989 "pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate, is an unrecognized "
2990 "enumerator");
2991 return false;
2992 }
2993 }
2994 if (pCreateInfos->pVertexInputState->pVertexAttributeDescriptions != nullptr) {
2995 if (pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format < VK_FORMAT_BEGIN_RANGE ||
2996 pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format > VK_FORMAT_END_RANGE) {
2997 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2998 "vkCreateGraphicsPipelines parameter, VkFormat "
2999 "pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format, is an unrecognized enumerator");
3000 return false;
3001 }
3002 }
3003 }
3004 if (pCreateInfos->pInputAssemblyState != nullptr) {
3005 if (pCreateInfos->pInputAssemblyState->topology < VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE ||
3006 pCreateInfos->pInputAssemblyState->topology > VK_PRIMITIVE_TOPOLOGY_END_RANGE) {
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003007 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003008 "vkCreateGraphicsPipelines parameter, VkPrimitiveTopology pCreateInfos->pInputAssemblyState->topology, is "
3009 "an unrecognized enumerator");
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003010 return false;
3011 }
3012 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003013 if (pCreateInfos->pRasterizationState != nullptr) {
3014 if (pCreateInfos->pRasterizationState->polygonMode < VK_POLYGON_MODE_BEGIN_RANGE ||
3015 pCreateInfos->pRasterizationState->polygonMode > VK_POLYGON_MODE_END_RANGE) {
3016 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3017 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode, is an "
3018 "unrecognized enumerator");
3019 return false;
3020 }
3021 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
3022 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3023 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
3024 "unrecognized enumerator");
3025 return false;
3026 }
3027 if (pCreateInfos->pRasterizationState->frontFace < VK_FRONT_FACE_BEGIN_RANGE ||
3028 pCreateInfos->pRasterizationState->frontFace > VK_FRONT_FACE_END_RANGE) {
3029 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3030 "vkCreateGraphicsPipelines parameter, VkFrontFace pCreateInfos->pRasterizationState->frontFace, is an "
3031 "unrecognized enumerator");
3032 return false;
3033 }
3034 }
3035 if (pCreateInfos->pDepthStencilState != nullptr) {
3036 if (pCreateInfos->pDepthStencilState->depthCompareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3037 pCreateInfos->pDepthStencilState->depthCompareOp > VK_COMPARE_OP_END_RANGE) {
3038 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3039 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->depthCompareOp, is an "
3040 "unrecognized enumerator");
3041 return false;
3042 }
3043 if (pCreateInfos->pDepthStencilState->front.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
3044 pCreateInfos->pDepthStencilState->front.failOp > VK_STENCIL_OP_END_RANGE) {
3045 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3046 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.failOp, is an "
3047 "unrecognized enumerator");
3048 return false;
3049 }
3050 if (pCreateInfos->pDepthStencilState->front.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
3051 pCreateInfos->pDepthStencilState->front.passOp > VK_STENCIL_OP_END_RANGE) {
3052 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3053 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.passOp, is an "
3054 "unrecognized enumerator");
3055 return false;
3056 }
3057 if (pCreateInfos->pDepthStencilState->front.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
3058 pCreateInfos->pDepthStencilState->front.depthFailOp > VK_STENCIL_OP_END_RANGE) {
3059 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3060 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.depthFailOp, is "
3061 "an unrecognized enumerator");
3062 return false;
3063 }
3064 if (pCreateInfos->pDepthStencilState->front.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3065 pCreateInfos->pDepthStencilState->front.compareOp > VK_COMPARE_OP_END_RANGE) {
3066 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3067 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->front.compareOp, is an "
3068 "unrecognized enumerator");
3069 return false;
3070 }
3071 if (pCreateInfos->pDepthStencilState->back.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
3072 pCreateInfos->pDepthStencilState->back.failOp > VK_STENCIL_OP_END_RANGE) {
3073 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3074 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.failOp, is an "
3075 "unrecognized enumerator");
3076 return false;
3077 }
3078 if (pCreateInfos->pDepthStencilState->back.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
3079 pCreateInfos->pDepthStencilState->back.passOp > VK_STENCIL_OP_END_RANGE) {
3080 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3081 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.passOp, is an "
3082 "unrecognized enumerator");
3083 return false;
3084 }
3085 if (pCreateInfos->pDepthStencilState->back.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
3086 pCreateInfos->pDepthStencilState->back.depthFailOp > VK_STENCIL_OP_END_RANGE) {
3087 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3088 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.depthFailOp, is "
3089 "an unrecognized enumerator");
3090 return false;
3091 }
3092 if (pCreateInfos->pDepthStencilState->back.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3093 pCreateInfos->pDepthStencilState->back.compareOp > VK_COMPARE_OP_END_RANGE) {
3094 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3095 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->back.compareOp, is an "
3096 "unrecognized enumerator");
3097 return false;
3098 }
3099 }
3100 if (pCreateInfos->pColorBlendState != nullptr) {
3101 if (pCreateInfos->pColorBlendState->logicOpEnable == VK_TRUE &&
3102 (pCreateInfos->pColorBlendState->logicOp < VK_LOGIC_OP_BEGIN_RANGE ||
3103 pCreateInfos->pColorBlendState->logicOp > VK_LOGIC_OP_END_RANGE)) {
3104 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3105 "vkCreateGraphicsPipelines parameter, VkLogicOp pCreateInfos->pColorBlendState->logicOp, is an "
3106 "unrecognized enumerator");
3107 return false;
3108 }
3109 if (pCreateInfos->pColorBlendState->pAttachments != nullptr &&
3110 pCreateInfos->pColorBlendState->pAttachments->blendEnable == VK_TRUE) {
3111 if (pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3112 pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3113 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3114 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3115 "pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor, is an unrecognized enumerator");
3116 return false;
3117 }
3118 if (pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3119 pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3120 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3121 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3122 "pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor, is an unrecognized enumerator");
3123 return false;
3124 }
3125 if (pCreateInfos->pColorBlendState->pAttachments->colorBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
3126 pCreateInfos->pColorBlendState->pAttachments->colorBlendOp > VK_BLEND_OP_END_RANGE) {
3127 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3128 "vkCreateGraphicsPipelines parameter, VkBlendOp "
3129 "pCreateInfos->pColorBlendState->pAttachments->colorBlendOp, is an unrecognized enumerator");
3130 return false;
3131 }
3132 if (pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3133 pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3134 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3135 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3136 "pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor, is an unrecognized enumerator");
3137 return false;
3138 }
3139 if (pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3140 pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3141 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3142 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3143 "pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor, is an unrecognized enumerator");
3144 return false;
3145 }
3146 if (pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
3147 pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp > VK_BLEND_OP_END_RANGE) {
3148 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3149 "vkCreateGraphicsPipelines parameter, VkBlendOp "
3150 "pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp, is an unrecognized enumerator");
3151 return false;
3152 }
3153 }
3154 }
3155 if (pCreateInfos->renderPass == VK_NULL_HANDLE) {
3156 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3157 "vkCreateGraphicsPipelines parameter, VkRenderPass pCreateInfos->renderPass, is null pointer");
3158 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003159
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003160 int i = 0;
3161 for (auto j = 0; j < pCreateInfos[i].stageCount; j++) {
3162 validate_string(data, "vkCreateGraphicsPipelines()", "pCreateInfos[i].pStages[j].pName",
3163 pCreateInfos[i].pStages[j].pName);
3164 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003165 }
3166
3167 return true;
3168}
3169
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003170bool PostCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count, VkPipeline *pPipelines,
3171 VkResult result) {
3172 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003173 std::string reason = "vkCreateGraphicsPipelines parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003174 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3175 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003176 return false;
3177 }
3178
3179 return true;
3180}
3181
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003182VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3183vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3184 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3185 VkPipeline *pPipelines) {
3186 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3187 VkBool32 skipCall = VK_FALSE;
3188 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003189 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003191 skipCall |= param_check_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3192 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003193
Dustin Graves1e92cd72016-02-09 14:00:18 -07003194 if (skipCall == VK_FALSE) {
3195 PreCreateGraphicsPipelines(device, pCreateInfos);
3196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003197 result = get_dispatch_table(pc_device_table_map, device)
3198 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003199
3200 PostCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pPipelines, result);
3201 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003202
3203 return result;
3204}
3205
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003206bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003207 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3208
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003209 if (pCreateInfos != nullptr) {
3210 // TODO: Handle count!
3211 int i = 0;
3212 validate_string(data, "vkCreateComputePipelines()", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003213 }
3214
3215 return true;
3216}
3217
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003218bool PostCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count, VkPipeline *pPipelines,
3219 VkResult result) {
3220 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003221 std::string reason = "vkCreateComputePipelines parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003222 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3223 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003224 return false;
3225 }
3226
3227 return true;
3228}
3229
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003230VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3231vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3232 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3233 VkPipeline *pPipelines) {
3234 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3235 VkBool32 skipCall = VK_FALSE;
3236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003237 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003239 skipCall |= param_check_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
3240 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003241
Dustin Graves1e92cd72016-02-09 14:00:18 -07003242 if (skipCall == VK_FALSE) {
3243 PreCreateComputePipelines(device, pCreateInfos);
3244
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003245 result = get_dispatch_table(pc_device_table_map, device)
3246 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003247
3248 PostCreateComputePipelines(device, pipelineCache, createInfoCount, pPipelines, result);
3249 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003250
3251 return result;
3252}
3253
Dustin Graves27a912a2016-03-07 17:52:14 -07003254VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003255vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003256 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003257 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003258 assert(my_data != NULL);
3259
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003260 skipCall |= param_check_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003261
3262 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003263 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003264 }
3265}
3266
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003267bool PostCreatePipelineLayout(VkDevice device, VkPipelineLayout *pPipelineLayout, VkResult result) {
3268 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003269 std::string reason = "vkCreatePipelineLayout parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003270 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3271 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003272 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003273 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003274
3275 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003276}
3277
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003278VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3279vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3280 VkPipelineLayout *pPipelineLayout) {
3281 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3282 VkBool32 skipCall = VK_FALSE;
3283 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003284 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003285
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003286 skipCall |= param_check_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003287
Dustin Graves1e92cd72016-02-09 14:00:18 -07003288 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003289 result =
3290 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003291
3292 PostCreatePipelineLayout(device, pPipelineLayout, result);
3293 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003294
3295 return result;
3296}
3297
Dustin Graves27a912a2016-03-07 17:52:14 -07003298VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003299vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003300 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003301 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003302 assert(my_data != NULL);
3303
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003304 skipCall |= param_check_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003305
3306 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003308 }
3309}
3310
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311bool PreCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo) {
3312 if (pCreateInfo != nullptr) {
3313 if (pCreateInfo->magFilter < VK_FILTER_BEGIN_RANGE || pCreateInfo->magFilter > VK_FILTER_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003314 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003315 "vkCreateSampler parameter, VkFilter pCreateInfo->magFilter, is an unrecognized enumerator");
3316 return false;
3317 }
3318 if (pCreateInfo->minFilter < VK_FILTER_BEGIN_RANGE || pCreateInfo->minFilter > VK_FILTER_END_RANGE) {
3319 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3320 "vkCreateSampler parameter, VkFilter pCreateInfo->minFilter, is an unrecognized enumerator");
3321 return false;
3322 }
3323 if (pCreateInfo->mipmapMode < VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE ||
3324 pCreateInfo->mipmapMode > VK_SAMPLER_MIPMAP_MODE_END_RANGE) {
3325 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3326 "vkCreateSampler parameter, VkSamplerMipmapMode pCreateInfo->mipmapMode, is an unrecognized enumerator");
3327 return false;
3328 }
3329 if (pCreateInfo->addressModeU < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3330 pCreateInfo->addressModeU > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3331 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3332 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeU, is an unrecognized enumerator");
3333 return false;
3334 }
3335 if (pCreateInfo->addressModeV < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3336 pCreateInfo->addressModeV > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3337 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3338 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeV, is an unrecognized enumerator");
3339 return false;
3340 }
3341 if (pCreateInfo->addressModeW < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3342 pCreateInfo->addressModeW > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3343 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3344 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeW, is an unrecognized enumerator");
3345 return false;
3346 }
3347 if (pCreateInfo->anisotropyEnable > VK_TRUE) {
3348 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3349 "vkCreateSampler parameter, VkBool32 pCreateInfo->anisotropyEnable, is an unrecognized boolean");
3350 return false;
3351 }
3352 if (pCreateInfo->compareEnable > VK_TRUE) {
3353 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3354 "vkCreateSampler parameter, VkBool32 pCreateInfo->compareEnable, is an unrecognized boolean");
3355 return false;
3356 }
3357 if (pCreateInfo->compareEnable) {
3358 if (pCreateInfo->compareOp < VK_COMPARE_OP_BEGIN_RANGE || pCreateInfo->compareOp > VK_COMPARE_OP_END_RANGE) {
3359 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3360 "vkCreateSampler parameter, VkCompareOp pCreateInfo->compareOp, is an unrecognized enumerator");
3361 return false;
3362 }
3363 }
3364 if (pCreateInfo->borderColor < VK_BORDER_COLOR_BEGIN_RANGE || pCreateInfo->borderColor > VK_BORDER_COLOR_END_RANGE) {
3365 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3366 "vkCreateSampler parameter, VkBorderColor pCreateInfo->borderColor, is an unrecognized enumerator");
3367 return false;
3368 }
3369 if (pCreateInfo->unnormalizedCoordinates > VK_TRUE) {
3370 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3371 "vkCreateSampler parameter, VkBool32 pCreateInfo->unnormalizedCoordinates, is an unrecognized boolean");
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003372 return false;
3373 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003374 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003375
3376 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003377}
3378
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003379bool PostCreateSampler(VkDevice device, VkSampler *pSampler, VkResult result) {
3380 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003381 std::string reason = "vkCreateSampler parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003382 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3383 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003384 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003385 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003386
3387 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003388}
3389
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003390VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3391 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
3392 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3393 VkBool32 skipCall = VK_FALSE;
3394 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003395 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003396
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003397 skipCall |= param_check_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003398
Dustin Graves1e92cd72016-02-09 14:00:18 -07003399 if (skipCall == VK_FALSE) {
3400 PreCreateSampler(device, pCreateInfo);
3401
3402 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3403
3404 PostCreateSampler(device, pSampler, result);
3405 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003406
3407 return result;
3408}
3409
Dustin Graves27a912a2016-03-07 17:52:14 -07003410VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003411vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003412 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003413 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003414 assert(my_data != NULL);
3415
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003416 skipCall |= param_check_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003417
3418 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003419 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003420 }
3421}
3422
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003423bool PreCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo) {
3424 if (pCreateInfo != nullptr) {
3425 if (pCreateInfo->pBindings != nullptr) {
3426 if (pCreateInfo->pBindings->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
3427 pCreateInfo->pBindings->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE) {
3428 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3429 "vkCreateDescriptorSetLayout parameter, VkDescriptorType pCreateInfo->pBindings->descriptorType, is an "
3430 "unrecognized enumerator");
3431 return false;
3432 }
3433 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003434 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003435
3436 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003437}
3438
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439bool PostCreateDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout *pSetLayout, VkResult result) {
3440 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003441 std::string reason = "vkCreateDescriptorSetLayout parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003442 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3443 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003444 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003445 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003446
3447 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003448}
3449
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003450VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3451vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3452 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
3453 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3454 VkBool32 skipCall = VK_FALSE;
3455 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003456 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003457
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003458 skipCall |= param_check_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003459
Dustin Graves1e92cd72016-02-09 14:00:18 -07003460 if (skipCall == VK_FALSE) {
3461 PreCreateDescriptorSetLayout(device, pCreateInfo);
3462
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003463 result =
3464 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003465
3466 PostCreateDescriptorSetLayout(device, pSetLayout, result);
3467 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003468
3469 return result;
3470}
3471
Dustin Graves27a912a2016-03-07 17:52:14 -07003472VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003473vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003474 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003475 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003476 assert(my_data != NULL);
3477
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003478 skipCall |= param_check_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003479
3480 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003481 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003482 }
3483}
3484
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003485bool PreCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo) {
3486 if (pCreateInfo != nullptr) {
3487 if (pCreateInfo->pPoolSizes != nullptr) {
3488 if (pCreateInfo->pPoolSizes->type < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
3489 pCreateInfo->pPoolSizes->type > VK_DESCRIPTOR_TYPE_END_RANGE) {
3490 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3491 "vkCreateDescriptorPool parameter, VkDescriptorType pCreateInfo->pTypeCount->type, is an unrecognized "
3492 "enumerator");
3493 return false;
3494 }
3495 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003496 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003497
3498 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003499}
3500
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003501bool PostCreateDescriptorPool(VkDevice device, uint32_t maxSets, VkDescriptorPool *pDescriptorPool, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003502
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003503 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
Jeremy Hayes99a96322015-06-26 12:48:09 -06003504
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003505 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003506 std::string reason = "vkCreateDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003507 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3508 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003509 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003510 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003511
3512 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003513}
3514
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003515VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3516vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3517 VkDescriptorPool *pDescriptorPool) {
3518 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3519 VkBool32 skipCall = VK_FALSE;
3520 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003521 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003522
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003523 skipCall |= param_check_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003524
Dustin Graves1e92cd72016-02-09 14:00:18 -07003525 if (skipCall == VK_FALSE) {
3526 PreCreateDescriptorPool(device, pCreateInfo);
3527
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003528 result =
3529 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003530
3531 PostCreateDescriptorPool(device, pCreateInfo->maxSets, pDescriptorPool, result);
3532 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003533
3534 return result;
3535}
3536
Dustin Graves27a912a2016-03-07 17:52:14 -07003537VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003538vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003539 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003540 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003541 assert(my_data != NULL);
3542
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003543 skipCall |= param_check_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003544
3545 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003546 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003547 }
3548}
3549
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003550bool PostResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003551
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003552 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003553 std::string reason = "vkResetDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003554 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3555 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003556 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003557 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003558
3559 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003560}
3561
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003562VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3563vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003564 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003565
3566 PostResetDescriptorPool(device, descriptorPool, result);
3567
3568 return result;
3569}
3570
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003571bool PostAllocateDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, VkDescriptorSet *pDescriptorSets,
3572 VkResult result) {
3573 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003574 std::string reason = "vkAllocateDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003575 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3576 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003577 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003578 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003579
3580 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003581}
3582
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003583VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3584vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
3585 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3586 VkBool32 skipCall = VK_FALSE;
3587 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003588 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003589
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003590 skipCall |= param_check_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003591
Dustin Graves1e92cd72016-02-09 14:00:18 -07003592 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003593 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3594
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003595 PostAllocateDescriptorSets(device, pAllocateInfo->descriptorPool, pAllocateInfo->descriptorSetCount, pDescriptorSets,
3596 result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003597 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003598
3599 return result;
3600}
3601
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003602bool PostFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003603
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003604 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003605 std::string reason = "vkFreeDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003606 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3607 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003608 return false;
3609 }
3610
3611 return true;
3612}
3613
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003614VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3615 uint32_t descriptorSetCount,
3616 const VkDescriptorSet *pDescriptorSets) {
3617 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3618 VkBool32 skipCall = VK_FALSE;
3619 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003620 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003621
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003622 skipCall |= param_check_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003623
Dustin Graves1e92cd72016-02-09 14:00:18 -07003624 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003625 result = get_dispatch_table(pc_device_table_map, device)
3626 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003627
3628 PostFreeDescriptorSets(device, descriptorPool, descriptorSetCount, result);
3629 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003630
3631 return result;
3632}
3633
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003634bool PreUpdateDescriptorSets(VkDevice device, const VkWriteDescriptorSet *pDescriptorWrites,
3635 const VkCopyDescriptorSet *pDescriptorCopies) {
3636 if (pDescriptorWrites != nullptr) {
3637 if (pDescriptorWrites->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
3638 pDescriptorWrites->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE) {
3639 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3640 "vkUpdateDescriptorSets parameter, VkDescriptorType pDescriptorWrites->descriptorType, is an unrecognized "
3641 "enumerator");
3642 return false;
3643 }
3644 /* TODO: Validate other parts of pImageInfo, pBufferInfo, pTexelBufferView? */
3645 /* TODO: This test should probably only be done if descriptorType is correct type of descriptor */
3646 if (pDescriptorWrites->pImageInfo != nullptr) {
3647 if (((pDescriptorWrites->pImageInfo->imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3648 (pDescriptorWrites->pImageInfo->imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3649 (pDescriptorWrites->pImageInfo->imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3650 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3651 "vkUpdateDescriptorSets parameter, VkImageLayout pDescriptorWrites->pDescriptors->imageLayout, is an "
3652 "unrecognized enumerator");
3653 return false;
3654 }
3655 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003656 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003657
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003658 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003659}
3660
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003661VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3662vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3663 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
3664 VkBool32 skipCall = VK_FALSE;
3665 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003666 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003667
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003668 skipCall |= param_check_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
3669 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003670
3671 if (skipCall == VK_FALSE) {
3672 PreUpdateDescriptorSets(device, pDescriptorWrites, pDescriptorCopies);
3673
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003674 get_dispatch_table(pc_device_table_map, device)
3675 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003676 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003677}
3678
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003679bool PostCreateFramebuffer(VkDevice device, VkFramebuffer *pFramebuffer, VkResult result) {
3680 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003681 std::string reason = "vkCreateFramebuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003682 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3683 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003684 return false;
3685 }
3686
3687 return true;
3688}
3689
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003690VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3691 const VkAllocationCallbacks *pAllocator,
3692 VkFramebuffer *pFramebuffer) {
3693 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3694 VkBool32 skipCall = VK_FALSE;
3695 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003696 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003697
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003698 skipCall |= param_check_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003699
Dustin Graves1e92cd72016-02-09 14:00:18 -07003700 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003701 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3702
3703 PostCreateFramebuffer(device, pFramebuffer, result);
3704 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003705
3706 return result;
3707}
3708
Dustin Graves27a912a2016-03-07 17:52:14 -07003709VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003710vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003711 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003712 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003713 assert(my_data != NULL);
3714
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003715 skipCall |= param_check_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003716
3717 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003718 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003719 }
3720}
3721
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003722bool PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo) {
3723 if (pCreateInfo != nullptr) {
3724 if (pCreateInfo->pAttachments != nullptr) {
3725 if (pCreateInfo->pAttachments->format < VK_FORMAT_BEGIN_RANGE ||
3726 pCreateInfo->pAttachments->format > VK_FORMAT_END_RANGE) {
3727 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3728 "vkCreateRenderPass parameter, VkFormat pCreateInfo->pAttachments->format, is an unrecognized enumerator");
3729 return false;
3730 }
3731 if (pCreateInfo->pAttachments->loadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
3732 pCreateInfo->pAttachments->loadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE) {
3733 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3734 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->loadOp, is an unrecognized "
3735 "enumerator");
3736 return false;
3737 }
3738 if (pCreateInfo->pAttachments->storeOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
3739 pCreateInfo->pAttachments->storeOp > VK_ATTACHMENT_STORE_OP_END_RANGE) {
3740 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3741 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->storeOp, is an unrecognized "
3742 "enumerator");
3743 return false;
3744 }
3745 if (pCreateInfo->pAttachments->stencilLoadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
3746 pCreateInfo->pAttachments->stencilLoadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE) {
3747 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3748 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->stencilLoadOp, is an "
3749 "unrecognized enumerator");
3750 return false;
3751 }
3752 if (pCreateInfo->pAttachments->stencilStoreOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
3753 pCreateInfo->pAttachments->stencilStoreOp > VK_ATTACHMENT_STORE_OP_END_RANGE) {
3754 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3755 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->stencilStoreOp, is an "
3756 "unrecognized enumerator");
3757 return false;
3758 }
3759 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3760 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3761 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3762 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3763 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->initialLayout, is an unrecognized "
3764 "enumerator");
3765 return false;
3766 }
3767 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3768 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3769 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3770 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3771 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->finalLayout, is an unrecognized "
3772 "enumerator");
3773 return false;
3774 }
3775 }
3776 if (pCreateInfo->pSubpasses != nullptr) {
3777 if (pCreateInfo->pSubpasses->pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
3778 pCreateInfo->pSubpasses->pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
3779 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3780 "vkCreateRenderPass parameter, VkPipelineBindPoint pCreateInfo->pSubpasses->pipelineBindPoint, is an "
3781 "unrecognized enumerator");
3782 return false;
3783 }
3784 if (pCreateInfo->pSubpasses->pInputAttachments != nullptr) {
3785 if (((pCreateInfo->pSubpasses->pInputAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3786 (pCreateInfo->pSubpasses->pInputAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3787 (pCreateInfo->pSubpasses->pInputAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3788 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3789 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pInputAttachments->layout, is an "
3790 "unrecognized enumerator");
3791 return false;
3792 }
3793 }
3794 if (pCreateInfo->pSubpasses->pColorAttachments != nullptr) {
3795 if (((pCreateInfo->pSubpasses->pColorAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3796 (pCreateInfo->pSubpasses->pColorAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3797 (pCreateInfo->pSubpasses->pColorAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3798 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3799 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pColorAttachments->layout, is an "
3800 "unrecognized enumerator");
3801 return false;
3802 }
3803 }
3804 if (pCreateInfo->pSubpasses->pResolveAttachments != nullptr) {
3805 if (((pCreateInfo->pSubpasses->pResolveAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3806 (pCreateInfo->pSubpasses->pResolveAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3807 (pCreateInfo->pSubpasses->pResolveAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3808 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3809 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pResolveAttachments->layout, is "
3810 "an unrecognized enumerator");
3811 return false;
3812 }
3813 }
3814 if (pCreateInfo->pSubpasses->pDepthStencilAttachment &&
3815 ((pCreateInfo->pSubpasses->pDepthStencilAttachment->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3816 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3817 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3818 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3819 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pDepthStencilAttachment->layout, is "
3820 "an unrecognized enumerator");
3821 return false;
3822 }
3823 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003824 }
3825
3826 return true;
3827}
3828
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003829bool PostCreateRenderPass(VkDevice device, VkRenderPass *pRenderPass, VkResult result) {
3830 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003831 std::string reason = "vkCreateRenderPass parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003832 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3833 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003834 return false;
3835 }
3836
3837 return true;
3838}
3839
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003840VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3841 const VkAllocationCallbacks *pAllocator,
3842 VkRenderPass *pRenderPass) {
3843 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3844 VkBool32 skipCall = VK_FALSE;
3845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003846 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003847
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003848 skipCall |= param_check_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003849
Dustin Graves1e92cd72016-02-09 14:00:18 -07003850 if (skipCall == VK_FALSE) {
3851 PreCreateRenderPass(device, pCreateInfo);
3852
3853 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3854
3855 PostCreateRenderPass(device, pRenderPass, result);
3856 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003857
3858 return result;
3859}
3860
Dustin Graves27a912a2016-03-07 17:52:14 -07003861VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003862vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003863 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003864 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003865 assert(my_data != NULL);
3866
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003867 skipCall |= param_check_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003868
3869 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003870 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003871 }
3872}
3873
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003874VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3875vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3876 VkBool32 skipCall = VK_FALSE;
3877 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003878 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003879
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003880 skipCall |= param_check_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003881
3882 if (skipCall == VK_FALSE) {
3883 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003884 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003885}
3886
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003887bool PostCreateCommandPool(VkDevice device, VkCommandPool *pCommandPool, VkResult result) {
3888 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003889 std::string reason = "vkCreateCommandPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003890 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3891 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003892 return false;
3893 }
3894
3895 return true;
3896}
3897
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003898VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3899 const VkAllocationCallbacks *pAllocator,
3900 VkCommandPool *pCommandPool) {
3901 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3902 VkBool32 skipCall = VK_FALSE;
3903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003904 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003905
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003906 skipCall |= param_check_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003907
Dustin Graves1e92cd72016-02-09 14:00:18 -07003908 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003909 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3910
3911 PostCreateCommandPool(device, pCommandPool, result);
3912 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003913
3914 return result;
3915}
3916
Dustin Graves27a912a2016-03-07 17:52:14 -07003917VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003918vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003919 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003920 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003921 assert(my_data != NULL);
3922
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003923 skipCall |= param_check_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003924
3925 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003926 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003927 }
3928}
3929
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930bool PostResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003931
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003932 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003933 std::string reason = "vkResetCommandPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3935 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003936 return false;
3937 }
3938
3939 return true;
3940}
3941
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003942VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3943vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003944 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003945
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003946 PostResetCommandPool(device, commandPool, flags, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003947
3948 return result;
3949}
3950
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003951bool PreCreateCommandBuffer(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo) {
3952 if (pCreateInfo != nullptr) {
3953 if (pCreateInfo->level < VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE || pCreateInfo->level > VK_COMMAND_BUFFER_LEVEL_END_RANGE) {
3954 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3955 "vkAllocateCommandBuffers parameter, VkCommandBufferLevel pCreateInfo->level, is an unrecognized enumerator");
3956 return false;
3957 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003958 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003959
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003960 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003961}
3962
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003963bool PostCreateCommandBuffer(VkDevice device, VkCommandBuffer *pCommandBuffer, VkResult result) {
3964 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003965 std::string reason = "vkAllocateCommandBuffers parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003966 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3967 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003968 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003969 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003970
3971 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003972}
3973
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003974VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3975vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
3976 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3977 VkBool32 skipCall = VK_FALSE;
3978 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003979 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003980
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003981 skipCall |= param_check_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003982
Dustin Graves1e92cd72016-02-09 14:00:18 -07003983 if (skipCall == VK_FALSE) {
3984 PreCreateCommandBuffer(device, pAllocateInfo);
3985
3986 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3987
3988 PostCreateCommandBuffer(device, pCommandBuffers, result);
3989 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003990
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003991 return result;
3992}
3993
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003994VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3995 uint32_t commandBufferCount,
3996 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003997 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003999 assert(my_data != NULL);
4000
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004001 skipCall |= param_check_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004002
4003 if (skipCall == VK_FALSE) {
4004 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004005 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004006 }
4007}
4008
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004009bool PostBeginCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004011 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004012 std::string reason = "vkBeginCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004013 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4014 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004015 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004016 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004017
4018 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004019}
4020
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004021VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4022vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
4023 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4024 VkBool32 skipCall = VK_FALSE;
4025 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004026 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004027
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 skipCall |= param_check_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004029
Dustin Graves1e92cd72016-02-09 14:00:18 -07004030 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004031 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
4032
4033 PostBeginCommandBuffer(commandBuffer, result);
4034 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004035
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004036 return result;
4037}
4038
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004039bool PostEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004041 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004042 std::string reason = "vkEndCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004043 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4044 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004045 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004046 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004047
4048 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004049}
4050
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004051VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004052 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004053
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004054 PostEndCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004055
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004056 return result;
4057}
4058
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004059bool PostResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004061 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004062 std::string reason = "vkResetCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004063 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4064 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004065 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004066 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004067
4068 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004069}
4070
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004071VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4072vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004073 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004075 PostResetCommandBuffer(commandBuffer, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004076
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004077 return result;
4078}
4079
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004080bool PostCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004081
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004082 if (pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE || pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004083 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004084 "vkCmdBindPipeline parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004085 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004086 }
4087
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004088 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004089}
4090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004091VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4092vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004093 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004094
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004095 PostCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004096}
4097
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004098VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4099vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
4100 VkBool32 skipCall = VK_FALSE;
4101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004102 assert(my_data != NULL);
4103
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004104 skipCall |= param_check_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004105
4106 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004107 get_dispatch_table(pc_device_table_map, commandBuffer)
4108 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004109 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004110}
4111
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004112VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4113vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
4114 VkBool32 skipCall = VK_FALSE;
4115 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004116 assert(my_data != NULL);
4117
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004118 skipCall |= param_check_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004119
4120 if (skipCall == VK_FALSE) {
4121 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4122 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004123}
4124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004125VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004126 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004127}
4128
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004129VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4130vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
4131 get_dispatch_table(pc_device_table_map, commandBuffer)
4132 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004133}
4134
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004135VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
4136 VkBool32 skipCall = VK_FALSE;
4137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004138 assert(my_data != NULL);
4139
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004140 skipCall |= param_check_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004141
4142 if (skipCall == VK_FALSE) {
4143 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4144 }
Cody Northrop12365112015-08-17 11:10:49 -06004145}
4146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004147VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4148vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004149 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004150}
4151
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004152VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4153vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004154 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004155}
4156
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004157VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4158vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004159 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004160}
4161
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004162VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4163vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004164 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004165}
4166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004167bool PostCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
4168 uint32_t firstSet, uint32_t setCount, uint32_t dynamicOffsetCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004169
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004170 if (pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE || pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004171 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004172 "vkCmdBindDescriptorSets parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004173 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004174 }
4175
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004176 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004177}
4178
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004179VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4180vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
4181 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
4182 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
4183 VkBool32 skipCall = VK_FALSE;
4184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004185 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004186
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004187 skipCall |= param_check_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4188 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004189
Dustin Graves1e92cd72016-02-09 14:00:18 -07004190 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004191 get_dispatch_table(pc_device_table_map, commandBuffer)
4192 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4193 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004194
4195 PostCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, dynamicOffsetCount);
4196 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004197}
4198
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004199bool PostCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004200
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004201 if (indexType < VK_INDEX_TYPE_BEGIN_RANGE || indexType > VK_INDEX_TYPE_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004202 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004203 "vkCmdBindIndexBuffer parameter, VkIndexType indexType, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004204 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004205 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004206
4207 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004208}
4209
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004210VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4211vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004212 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004213
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004214 PostCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004215}
4216
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004217VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4218 uint32_t bindingCount, const VkBuffer *pBuffers,
4219 const VkDeviceSize *pOffsets) {
4220 VkBool32 skipCall = VK_FALSE;
4221 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004222 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004223
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004224 skipCall |= param_check_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004225
Dustin Graves1e92cd72016-02-09 14:00:18 -07004226 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004227 get_dispatch_table(pc_device_table_map, commandBuffer)
4228 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004229 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004230}
4231
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004232bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4233 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004234 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004235 // 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 -07004236 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004237 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004238 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004239 return false;
4240 }
4241
4242 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004243 // 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 -07004244 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004245 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004246 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004247 return false;
4248 }
4249
4250 return true;
4251}
4252
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004253VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4254 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004255 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004256
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004257 get_dispatch_table(pc_device_table_map, commandBuffer)
4258 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004259}
4260
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
4262 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
4263 uint32_t firstInstance) {
4264 get_dispatch_table(pc_device_table_map, commandBuffer)
4265 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004266}
4267
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004268VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4269vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004270 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004271}
4272
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004273VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4274vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004275 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004276}
4277
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004278VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004279 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004280}
4281
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4283vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004284 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004285}
4286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004287VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4288 uint32_t regionCount, const VkBufferCopy *pRegions) {
4289 VkBool32 skipCall = VK_FALSE;
4290 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004291 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004292
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004293 skipCall |= param_check_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004294
Dustin Graves1e92cd72016-02-09 14:00:18 -07004295 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004296 get_dispatch_table(pc_device_table_map, commandBuffer)
4297 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004298 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004299}
4300
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004301bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4302 if (pRegions != nullptr) {
4303 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4304 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4305 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4306 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4307 return false;
4308 }
4309 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4310 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4311 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4312 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4313 return false;
4314 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004315 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004316
4317 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004318}
4319
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004320bool PostCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4321 VkImageLayout dstImageLayout, uint32_t regionCount) {
4322 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4323 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004324 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004325 "vkCmdCopyImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004326 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004327 }
4328
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004329 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4330 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004331 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004332 "vkCmdCopyImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004333 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004334 }
4335
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004336 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004337}
4338
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004339VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4340vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4341 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
4342 VkBool32 skipCall = VK_FALSE;
4343 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004344 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004345
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004346 skipCall |=
4347 param_check_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004348
Dustin Graves1e92cd72016-02-09 14:00:18 -07004349 if (skipCall == VK_FALSE) {
4350 PreCmdCopyImage(commandBuffer, pRegions);
4351
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004352 get_dispatch_table(pc_device_table_map, commandBuffer)
4353 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004354
4355 PostCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
4356 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004357}
4358
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004359bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4360 if (pRegions != nullptr) {
4361 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4362 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4363 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4364 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4365 return false;
4366 }
4367 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4368 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4369 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4370 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4371 return false;
4372 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004373 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004374
4375 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004376}
4377
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004378bool PostCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4379 VkImageLayout dstImageLayout, uint32_t regionCount, VkFilter filter) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004380
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004381 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4382 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004383 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004384 "vkCmdBlitImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004385 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004386 }
4387
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004388 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4389 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004390 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004391 "vkCmdBlitImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004392 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004393 }
4394
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004395 if (filter < VK_FILTER_BEGIN_RANGE || filter > VK_FILTER_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004396 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004397 "vkCmdBlitImage parameter, VkFilter filter, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004398 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004399 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004400
4401 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004402}
4403
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004404VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4405vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4406 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
4407 VkBool32 skipCall = VK_FALSE;
4408 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004409 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004410
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004411 skipCall |= param_check_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4412 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004413
Dustin Graves1e92cd72016-02-09 14:00:18 -07004414 if (skipCall == VK_FALSE) {
4415 PreCmdBlitImage(commandBuffer, pRegions);
4416
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004417 get_dispatch_table(pc_device_table_map, commandBuffer)
4418 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004419
4420 PostCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, filter);
4421 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004422}
4423
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004424bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4425 if (pRegions != nullptr) {
4426 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4427 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4428 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4429 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4430 "enumerator");
4431 return false;
4432 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004433 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004434
4435 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004436}
4437
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004438bool PostCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout,
4439 uint32_t regionCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004440
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004441 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4442 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004443 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004444 "vkCmdCopyBufferToImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004445 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004446 }
4447
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004448 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449}
4450
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004451VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4452 VkImage dstImage, VkImageLayout dstImageLayout,
4453 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4454 VkBool32 skipCall = VK_FALSE;
4455 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004456 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004457
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004458 skipCall |=
4459 param_check_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004460
Dustin Graves1e92cd72016-02-09 14:00:18 -07004461 if (skipCall == VK_FALSE) {
4462 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4463
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004464 get_dispatch_table(pc_device_table_map, commandBuffer)
4465 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004466
4467 PostCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount);
4468 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004469}
4470
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004471bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4472 if (pRegions != nullptr) {
4473 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4474 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4475 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4476 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4477 "enumerator");
4478 return false;
4479 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004480 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004481
4482 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004483}
4484
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004485bool PostCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4486 uint32_t regionCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004487
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004488 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4489 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004490 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004491 "vkCmdCopyImageToBuffer parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004492 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004493 }
4494
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004495 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004496}
4497
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004498VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4499 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4500 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4501 VkBool32 skipCall = VK_FALSE;
4502 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004503 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004504
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004505 skipCall |=
4506 param_check_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004507
Dustin Graves1e92cd72016-02-09 14:00:18 -07004508 if (skipCall == VK_FALSE) {
4509 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4510
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004511 get_dispatch_table(pc_device_table_map, commandBuffer)
4512 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004513
4514 PostCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount);
4515 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004516}
4517
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004518VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
4519 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
4520 VkBool32 skipCall = VK_FALSE;
4521 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004522 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004523
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004524 skipCall |= param_check_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004525
Dustin Graves1e92cd72016-02-09 14:00:18 -07004526 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004527 get_dispatch_table(pc_device_table_map, commandBuffer)
4528 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004529 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004530}
4531
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004532VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4533vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004534 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004535}
4536
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004537bool PostCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, uint32_t rangeCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004538
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004539 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4540 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004541 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004542 "vkCmdClearColorImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004543 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004544 }
4545
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004546 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004547}
4548
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004549VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4550 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4551 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
4552 VkBool32 skipCall = VK_FALSE;
4553 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004554 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004555
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004556 skipCall |= param_check_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004557
Dustin Graves1e92cd72016-02-09 14:00:18 -07004558 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004559 get_dispatch_table(pc_device_table_map, commandBuffer)
4560 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004561
4562 PostCmdClearColorImage(commandBuffer, image, imageLayout, rangeCount);
4563 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004564}
4565
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004566bool PostCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4567 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004568
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004569 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4570 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004571 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004572 "vkCmdClearDepthStencilImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004573 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004574 }
4575
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004576 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004577}
4578
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004579VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4580vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4581 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4582 const VkImageSubresourceRange *pRanges) {
4583 VkBool32 skipCall = VK_FALSE;
4584 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004585 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004586
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004587 skipCall |=
4588 param_check_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004589
Dustin Graves1e92cd72016-02-09 14:00:18 -07004590 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004591 get_dispatch_table(pc_device_table_map, commandBuffer)
4592 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004593
4594 PostCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount);
4595 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004596}
4597
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004598VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4599 const VkClearAttachment *pAttachments, uint32_t rectCount,
4600 const VkClearRect *pRects) {
4601 VkBool32 skipCall = VK_FALSE;
4602 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004603 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004604
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004605 skipCall |= param_check_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004606
4607 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004608 get_dispatch_table(pc_device_table_map, commandBuffer)
4609 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004610 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004611}
4612
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004613bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4614 if (pRegions != nullptr) {
4615 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4616 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4617 log_msg(
4618 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4619 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4620 return false;
4621 }
4622 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4623 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4624 log_msg(
4625 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4626 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4627 return false;
4628 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004629 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004630
4631 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004632}
4633
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004634bool PostCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4635 VkImageLayout dstImageLayout, uint32_t regionCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004636
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004637 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4638 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004639 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004640 "vkCmdResolveImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004641 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004642 }
4643
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004644 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4645 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004646 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004647 "vkCmdResolveImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004648 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004649 }
4650
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004651 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004652}
4653
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004654VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4655vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4656 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
4657 VkBool32 skipCall = VK_FALSE;
4658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004659 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004660
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004661 skipCall |= param_check_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4662 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004663
Dustin Graves1e92cd72016-02-09 14:00:18 -07004664 if (skipCall == VK_FALSE) {
4665 PreCmdResolveImage(commandBuffer, pRegions);
4666
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004667 get_dispatch_table(pc_device_table_map, commandBuffer)
4668 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004669
4670 PostCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
4671 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004672}
4673
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004674VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4675vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004676 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004677}
4678
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004679VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4680vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004681 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004682}
4683
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004684VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4685vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4686 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4687 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4688 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4689 VkBool32 skipCall = VK_FALSE;
4690 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004691 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004692
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004693 skipCall |= param_check_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4694 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4695 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004696
Dustin Graves1e92cd72016-02-09 14:00:18 -07004697 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004698 get_dispatch_table(pc_device_table_map, commandBuffer)
4699 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4700 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004701 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004702}
4703
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004704VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4705vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4706 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4707 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4708 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4709 VkBool32 skipCall = VK_FALSE;
4710 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004711 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004712
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004713 skipCall |= param_check_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4714 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4715 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004716
Dustin Graves1e92cd72016-02-09 14:00:18 -07004717 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004718 get_dispatch_table(pc_device_table_map, commandBuffer)
4719 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4720 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004721 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004722}
4723
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004724VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4725vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004726 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004727}
4728
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004729VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004730 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004731}
4732
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004733VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4734vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004735 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004736}
4737
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004738bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4739 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004740
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004741 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004742
4743 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004744}
4745
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004746VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4747vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004748 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004749
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004750 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004751}
4752
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004753VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4754vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4755 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
4756 get_dispatch_table(pc_device_table_map, commandBuffer)
4757 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004758}
4759
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004760VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4761 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4762 const void *pValues) {
4763 VkBool32 skipCall = VK_FALSE;
4764 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004765 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004766
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004767 skipCall |= param_check_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004768
Dustin Graves1e92cd72016-02-09 14:00:18 -07004769 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004770 get_dispatch_table(pc_device_table_map, commandBuffer)
4771 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004772 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004773}
4774
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004775bool PostCmdBeginRenderPass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004776
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004777 if (contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE || contents > VK_SUBPASS_CONTENTS_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004778 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004779 "vkCmdBeginRenderPass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004780 return false;
4781 }
4782
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004783 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004784}
4785
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004786VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4787vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
4788 VkBool32 skipCall = VK_FALSE;
4789 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004790 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004791
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004792 skipCall |= param_check_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004793
Dustin Graves1e92cd72016-02-09 14:00:18 -07004794 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004795 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
4796
4797 PostCmdBeginRenderPass(commandBuffer, contents);
4798 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004799}
4800
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004801bool PostCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004802
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004803 if (contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE || contents > VK_SUBPASS_CONTENTS_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004804 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004805 "vkCmdNextSubpass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004806 return false;
Chia-I Wu08accc62015-07-07 11:50:03 +08004807 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004808
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004809 return true;
Chia-I Wu08accc62015-07-07 11:50:03 +08004810}
4811
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004812VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004813 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
Chia-I Wu08accc62015-07-07 11:50:03 +08004814
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004815 PostCmdNextSubpass(commandBuffer, contents);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004816}
4817
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004818VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004819 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004820}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004821
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004822VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4823vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
4824 VkBool32 skipCall = VK_FALSE;
4825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004826 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004827
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004828 skipCall |= param_check_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004829
Dustin Graves1e92cd72016-02-09 14:00:18 -07004830 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004831 get_dispatch_table(pc_device_table_map, commandBuffer)
4832 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004833 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004834}
4835
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004836VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004837 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4838
4839 if (validate_string(data, "vkGetDeviceProcAddr()", "funcName", funcName) == VK_TRUE) {
4840 return NULL;
4841 }
4842
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004843 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004844 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004845 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004846 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004847 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004848 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004849 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004850 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004851 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004852 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004853 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004854 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004855 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004856 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07004857 if (!strcmp(funcName, "vkFreeMemory"))
4858 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004859 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004860 return (PFN_vkVoidFunction)vkMapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004861 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004862 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004863 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004864 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004865 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004866 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07004867 if (!strcmp(funcName, "vkDestroyFence"))
4868 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004869 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004870 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004871 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004872 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004873 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004874 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004875 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004876 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07004877 if (!strcmp(funcName, "vkDestroySemaphore"))
4878 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004879 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004880 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07004881 if (!strcmp(funcName, "vkDestroyEvent"))
4882 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004883 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004884 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004885 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004886 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004887 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004888 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004889 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004890 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004891 if (!strcmp(funcName, "vkDestroyQueryPool"))
4892 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004893 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004894 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004895 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004896 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004897 if (!strcmp(funcName, "vkDestroyBuffer"))
4898 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004899 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004900 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004901 if (!strcmp(funcName, "vkDestroyBufferView"))
4902 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004903 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004904 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07004905 if (!strcmp(funcName, "vkDestroyImage"))
4906 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004907 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004908 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004909 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004910 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004911 if (!strcmp(funcName, "vkDestroyImageView"))
4912 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05004913 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004914 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07004915 if (!strcmp(funcName, "vkDestroyShaderModule"))
4916 return (PFN_vkVoidFunction)vkDestroyShaderModule;
4917 if (!strcmp(funcName, "vkCreatePipelineCache"))
4918 return (PFN_vkVoidFunction)vkCreatePipelineCache;
4919 if (!strcmp(funcName, "vkDestroyPipelineCache"))
4920 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
4921 if (!strcmp(funcName, "vkGetPipelineCacheData"))
4922 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
4923 if (!strcmp(funcName, "vkMergePipelineCaches"))
4924 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004925 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004926 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004927 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004928 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07004929 if (!strcmp(funcName, "vkDestroyPipeline"))
4930 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004931 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004932 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004933 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
4934 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004935 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004936 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07004937 if (!strcmp(funcName, "vkDestroySampler"))
4938 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004939 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004940 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004941 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
4942 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004943 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004944 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004945 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
4946 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004947 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004948 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004949 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004950 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004951 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004952 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004953 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004954 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004955 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004956 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004957 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004958 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004959 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004960 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004961 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004962 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004963 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004964 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004965 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004966 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004967 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004968 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004969 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004970 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004971 if (!strcmp(funcName, "vkFreeCommandBuffers"))
4972 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004973 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004974 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004975 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004976 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004977 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004978 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004979 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004980 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004981 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004982 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004983 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004984 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004985 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004986 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004987 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004988 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004989 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004990 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004991 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004992 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004993 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004994 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004995 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004996 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004997 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004998 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004999 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005000 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005001 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005002 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005003 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005004 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005005 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005006 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005007 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005008 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005009 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005010 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005011 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005012 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005013 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005014 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005015 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005016 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005017 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005018 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005019 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005020 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005021 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005022 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005023 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005024 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005025 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005026 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005027 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005028 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005029 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005030 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005031 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005032 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005033 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005034 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005035 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005036 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07005037 if (!strcmp(funcName, "vkDestroyFramebuffer"))
5038 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005039 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005040 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07005041 if (!strcmp(funcName, "vkDestroyRenderPass"))
5042 return (PFN_vkVoidFunction)vkDestroyRenderPass;
5043 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
5044 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
5045 if (!strcmp(funcName, "vkCreateCommandPool"))
5046 return (PFN_vkVoidFunction)vkCreateCommandPool;
5047 if (!strcmp(funcName, "vkDestroyCommandPool"))
5048 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005049 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005050 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08005051 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005052 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06005053
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005054 if (device == NULL) {
5055 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005056 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005057
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005058 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005059 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005060 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005061}
5062
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005063VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005064 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005065 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005066 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005067 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005068 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005069 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005070 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005071 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005072 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005073 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005074 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005075 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005076 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005077 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06005078 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005079 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005080 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005081 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005082 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005083 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005084 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005085 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005086 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005087 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005088
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005089 if (instance == NULL) {
5090 return NULL;
5091 }
5092
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005093 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005094
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005095 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005096 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005097 return fptr;
5098
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005099 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005100 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005101 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005102}