blob: dd4d57259b42fe5249f56e72b11c4616e6b33cab [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
Jon Ashburn5484e0c2016-03-08 17:48:44 -070095static void InitParamChecker(layer_data *data, const VkAllocationCallbacks *pAllocator) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070096 VkDebugReportCallbackEXT callback;
Mark Lobodzinski8cbde242016-02-23 09:58:39 -070097 uint32_t report_flags = getLayerOptionFlags("lunarg_param_checker.report_flags", 0);
Jeremy Hayes99a96322015-06-26 12:48:09 -060098
99 uint32_t debug_action = 0;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700100 getLayerOptionEnum("lunarg_param_checker.debug_action", (uint32_t *)&debug_action);
101 if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102 FILE *log_output = NULL;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700103 const char *option_str = getLayerOption("lunarg_param_checker.log_filename");
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700104 log_output = getLayerLogOutput(option_str, "lunarg_param_checker");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700105 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700106 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700107 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700108 dbgCreateInfo.flags = report_flags;
109 dbgCreateInfo.pfnCallback = log_callback;
110 dbgCreateInfo.pUserData = log_output;
111
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700112 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600113 data->logging_callback.push_back(callback);
114 }
115
116 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700117 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700118 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700119 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700120 dbgCreateInfo.flags = report_flags;
121 dbgCreateInfo.pfnCallback = win32_debug_output_msg;
122 dbgCreateInfo.pUserData = NULL;
123
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700124 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600125 data->logging_callback.push_back(callback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600126 }
127}
128
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700129VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
130vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
131 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700132 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700133 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600134
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700135 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700136 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
137 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600138 }
139
140 return result;
141}
142
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700143VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
144 VkDebugReportCallbackEXT msgCallback,
145 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700146 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700147 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600148
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700149 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700150 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600151}
152
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
154vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
155 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700156 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
157 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700158}
159
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600161
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700162VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
163vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700164 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600165}
166
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167static const VkLayerProperties pc_global_layers[] = {{
168 "VK_LAYER_LUNARG_param_checker", VK_API_VERSION, 1, "LunarG Validation Layer",
169}};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700170
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700171VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
172vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
173 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600174}
175
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
177 const char *pLayerName, uint32_t *pCount,
178 VkExtensionProperties *pProperties) {
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700179 /* param_checker does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700180 if (pLayerName == NULL) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 return get_dispatch_table(pc_instance_table_map, physicalDevice)
182 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700183 } else {
184 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
185 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600186}
187
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
189vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700190
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700191 /* param_checker's physical device layers are the same as global */
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700192 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600193}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600194
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700195static std::string EnumeratorString(VkResult const &enumerator) {
196 switch (enumerator) {
197 case VK_RESULT_MAX_ENUM: {
198 return "VK_RESULT_MAX_ENUM";
199 break;
200 }
201 case VK_ERROR_LAYER_NOT_PRESENT: {
202 return "VK_ERROR_LAYER_NOT_PRESENT";
203 break;
204 }
205 case VK_ERROR_INCOMPATIBLE_DRIVER: {
206 return "VK_ERROR_INCOMPATIBLE_DRIVER";
207 break;
208 }
209 case VK_ERROR_MEMORY_MAP_FAILED: {
210 return "VK_ERROR_MEMORY_MAP_FAILED";
211 break;
212 }
213 case VK_INCOMPLETE: {
214 return "VK_INCOMPLETE";
215 break;
216 }
217 case VK_ERROR_OUT_OF_HOST_MEMORY: {
218 return "VK_ERROR_OUT_OF_HOST_MEMORY";
219 break;
220 }
221 case VK_ERROR_INITIALIZATION_FAILED: {
222 return "VK_ERROR_INITIALIZATION_FAILED";
223 break;
224 }
225 case VK_NOT_READY: {
226 return "VK_NOT_READY";
227 break;
228 }
229 case VK_ERROR_OUT_OF_DEVICE_MEMORY: {
230 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
231 break;
232 }
233 case VK_EVENT_SET: {
234 return "VK_EVENT_SET";
235 break;
236 }
237 case VK_TIMEOUT: {
238 return "VK_TIMEOUT";
239 break;
240 }
241 case VK_EVENT_RESET: {
242 return "VK_EVENT_RESET";
243 break;
244 }
245 case VK_SUCCESS: {
246 return "VK_SUCCESS";
247 break;
248 }
249 case VK_ERROR_EXTENSION_NOT_PRESENT: {
250 return "VK_ERROR_EXTENSION_NOT_PRESENT";
251 break;
252 }
253 case VK_ERROR_DEVICE_LOST: {
254 return "VK_ERROR_DEVICE_LOST";
255 break;
256 }
257 default: {
258 return "unrecognized enumerator";
259 break;
260 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600261 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600262}
263
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700264static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600265 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700266 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
267 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
268 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
269 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
270 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 -0700271 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700272 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600273 return false;
274 }
275
276 return true;
277}
278
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
280 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600281 return "unrecognized enumerator";
282 }
283
284 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700285 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600286 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
287 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700288 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600289 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
290 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700291 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600292 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
293 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700294 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600295 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
296 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700297 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600298 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
299 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700300 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600301 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
302 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700303 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600304 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
305 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700306 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600307 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
308 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700309 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600310 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
311 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600313 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
314 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700315 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800316 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600317 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700318 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800319 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600320 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700321 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700322 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
323 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600324
325 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600327 enumeratorString += string;
328
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700329 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600330 enumeratorString += '|';
331 }
332 }
333
334 return enumeratorString;
335}
336
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
338 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
339 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
340 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
341 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
342 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600343 return false;
344 }
345
346 return true;
347}
348
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700349static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
350 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600351 return "unrecognized enumerator";
352 }
353
354 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700355 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600356 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
357 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700358 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600359 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600360 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700361 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600362 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
363 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700364 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600365 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
366 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700367 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600368 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
369 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700370 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600372 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700373 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600374 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
375 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700376 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800377 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600378 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600379
380 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700381 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600382 enumeratorString += string;
383
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700384 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600385 enumeratorString += '|';
386 }
387 }
388
389 return enumeratorString;
390}
391
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700392static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
393 VkQueueFlagBits allFlags =
394 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
395 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600396 return false;
397 }
398
399 return true;
400}
401
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700402static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
403 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600404 return "unrecognized enumerator";
405 }
406
407 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700408 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800409 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600410 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700411 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 strings.push_back("VK_QUEUE_COMPUTE_BIT");
413 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700414 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800415 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600416 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600418 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
419 }
420
421 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700422 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600423 enumeratorString += string;
424
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700425 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600426 enumeratorString += '|';
427 }
428 }
429
430 return enumeratorString;
431}
432
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700433static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
434 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
435 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
436 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
437 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600438 return false;
439 }
440
441 return true;
442}
443
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700444static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
445 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600446 return "unrecognized enumerator";
447 }
448
449 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700450 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600451 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
452 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700453 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800454 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600455 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700456 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600457 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
458 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700459 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800460 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600461 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700462 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800463 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600464 }
465
466 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700467 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600468 enumeratorString += string;
469
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700470 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600471 enumeratorString += '|';
472 }
473 }
474
475 return enumeratorString;
476}
477
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700478static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700479 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600481 return false;
482 }
483
484 return true;
485}
486
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700487static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
488 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600489 return "unrecognized enumerator";
490 }
491
492 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700493 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800494 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600495 }
496
497 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600499 enumeratorString += string;
500
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700501 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600502 enumeratorString += '|';
503 }
504 }
505
506 return enumeratorString;
507}
508
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700509static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
510 VkSparseImageFormatFlagBits allFlags =
511 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
512 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
513 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600515 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600516
517 return true;
518}
519
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700520static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
521 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600522 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600523 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600524
525 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800527 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600528 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700529 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800530 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600531 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700532 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800533 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600534 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600535
536 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700537 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600538 enumeratorString += string;
539
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700540 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600541 enumeratorString += '|';
542 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600543 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600544
545 return enumeratorString;
546}
547
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700548static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700549 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600551 return false;
552 }
553
554 return true;
555}
556
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700557static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
558 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600559 return "unrecognized enumerator";
560 }
561
562 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700563 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600564 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
565 }
566
567 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700568 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600569 enumeratorString += string;
570
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700571 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600572 enumeratorString += '|';
573 }
574 }
575
576 return enumeratorString;
577}
578
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700579static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
580 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
581 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
582 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
583 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
584 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600585 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
586 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
587 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600589 return false;
590 }
591
592 return true;
593}
594
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700595static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
596 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600597 return "unrecognized enumerator";
598 }
599
600 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700601 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700602 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600603 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700604 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700605 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600606 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700608 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600609 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700610 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700611 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600612 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700613 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700614 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600615 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700616 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700617 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600618 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700619 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700620 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600621 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700622 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700623 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600624 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700626 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600627 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700628 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700629 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600630 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700631 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700632 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600633 }
634
635 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700636 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600637 enumeratorString += string;
638
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700639 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600640 enumeratorString += '|';
641 }
642 }
643
644 return enumeratorString;
645}
646
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700647static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
648 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
649 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
650 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600651 return false;
652 }
653
654 return true;
655}
656
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700657static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
658 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600659 return "unrecognized enumerator";
660 }
661
662 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700663 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600664 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
665 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700666 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600667 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
668 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700669 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600670 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
671 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700672 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600673 strings.push_back("VK_QUERY_RESULT_64_BIT");
674 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600675
676 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 enumeratorString += string;
679
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700680 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600681 enumeratorString += '|';
682 }
683 }
684
685 return enumeratorString;
686}
687
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
689 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
690 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
691 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
692 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
693 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600694 return false;
695 }
696
697 return true;
698}
699
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700700static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
701 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600702 return "unrecognized enumerator";
703 }
704
705 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700706 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600707 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
708 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700709 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
711 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700712 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600713 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
714 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700715 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600716 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
717 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600719 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
720 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700721 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800722 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600723 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700724 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600725 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
726 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700727 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800728 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600729 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700730 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600731 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
732 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600733
734 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700735 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600736 enumeratorString += string;
737
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700738 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600739 enumeratorString += '|';
740 }
741 }
742
743 return enumeratorString;
744}
745
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700746static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
747 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
748 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
749 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600750 return false;
751 }
752
753 return true;
754}
755
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700756static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
757 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600758 return "unrecognized enumerator";
759 }
760
761 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700762 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600763 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
764 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700765 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600766 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
767 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700768 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600769 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600770 }
771
772 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700773 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600774 enumeratorString += string;
775
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600777 enumeratorString += '|';
778 }
779 }
780
781 return enumeratorString;
782}
783
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700784static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
785 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
786 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
787 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
788 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600789 return false;
790 }
791
792 return true;
793}
794
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
796 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600797 return "unrecognized enumerator";
798 }
799
800 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700801 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600802 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
803 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700804 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600805 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600808 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
809 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700810 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600811 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
812 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700813 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600814 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600815 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600816
817 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600819 enumeratorString += string;
820
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700821 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600822 enumeratorString += '|';
823 }
824 }
825
826 return enumeratorString;
827}
828
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
830 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
831 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
832 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600833 return false;
834 }
835
836 return true;
837}
838
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700839static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
840 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600841 return "unrecognized enumerator";
842 }
843
844 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700845 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800846 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600847 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800849 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600850 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800852 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800855 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 }
857
858 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700859 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600860 enumeratorString += string;
861
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600863 enumeratorString += '|';
864 }
865 }
866
867 return enumeratorString;
868}
869
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700870static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
871 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
872 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
873 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 return false;
875 }
876
877 return true;
878}
879
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
881 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 return "unrecognized enumerator";
883 }
884
885 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600887 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600894 }
895
896 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700897 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 enumeratorString += string;
899
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700900 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600901 enumeratorString += '|';
902 }
903 }
904
905 return enumeratorString;
906}
907
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
909 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
910 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
911 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
912 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600913 return false;
914 }
915
916 return true;
917}
918
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700919static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
920 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600921 return "unrecognized enumerator";
922 }
923
924 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700925 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600926 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600927 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700928 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600929 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600930 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700931 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600932 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
933 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700934 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600935 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
936 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700937 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600938 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600939 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700940 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600941 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600942 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700943 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600944 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600945 }
946
947 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600949 enumeratorString += string;
950
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600952 enumeratorString += '|';
953 }
954 }
955
956 return enumeratorString;
957}
958
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800960 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700961 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
962 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
963 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
964 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
965 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
966 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 -0700967 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600969 return false;
970 }
971
972 return true;
973}
974
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
976 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600977 return "unrecognized enumerator";
978 }
979
980 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800982 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
983 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700984 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800985 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600986 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700987 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600988 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600989 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700990 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600991 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600992 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700993 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600994 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600995 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700996 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700997 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600998 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001000 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001001 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001002 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001003 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001004 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001005 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001006 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001007 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001009 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001010 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001011 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001012 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
1013 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001014 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001015 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
1016 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001018 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001019 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001020 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001021 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
1022 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001023 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001024 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
1025 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001026 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001027 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
1028 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001029 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001030 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001031 }
1032
1033 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001035 enumeratorString += string;
1036
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001037 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001038 enumeratorString += '|';
1039 }
1040 }
1041
1042 return enumeratorString;
1043}
1044
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001045static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +08001046 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001047 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
1048 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
1049 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
1050 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
1051 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 +08001052
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001053 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001054 return false;
1055 }
1056
1057 return true;
1058}
1059
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001060static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
1061 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001062 return "unrecognized enumerator";
1063 }
1064
1065 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001066 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001067 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001068 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001069 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001070 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001071 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001072 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001073 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001074 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001075 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001076 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001077 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001078 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001079 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001080 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001081 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001082 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001083 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001084 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001085 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001086 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001087 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001088 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001090 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001091 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001092 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001093 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001094 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001095 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001096 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001097 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001098 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001099 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001100 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001101 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001102 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001103 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001104 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001105 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001106 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001107 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001109 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001110 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001111 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001112 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001113 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001115 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001116 }
1117
1118 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001120 enumeratorString += string;
1121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001123 enumeratorString += '|';
1124 }
1125 }
1126
1127 return enumeratorString;
1128}
1129
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001130static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1131 VkCommandPoolCreateFlagBits allFlags =
1132 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1133 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001134 return false;
1135 }
1136
1137 return true;
1138}
1139
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001140static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1141 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001142 return "unrecognized enumerator";
1143 }
1144
1145 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001146 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001147 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001148 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001149 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001150 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001151 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001152
1153 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001154 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001155 enumeratorString += string;
1156
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001157 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001158 enumeratorString += '|';
1159 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001160 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001161
1162 return enumeratorString;
1163}
1164
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001165static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001166 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001167 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001168 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001169 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170
1171 return true;
1172}
1173
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001174static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1175 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001176 return "unrecognized enumerator";
1177 }
1178
1179 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001180 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001181 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001182 }
1183
1184 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001186 enumeratorString += string;
1187
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001188 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001189 enumeratorString += '|';
1190 }
1191 }
1192
1193 return enumeratorString;
1194}
1195
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001196static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1197 VkCommandBufferUsageFlags allFlags =
1198 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1199 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1200 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001201 return false;
1202 }
1203
1204 return true;
1205}
1206
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001207static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1208 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001209 return "unrecognized enumerator";
1210 }
1211
1212 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001213 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001214 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001215 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001216 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001217 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001218 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001219 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001220 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001221 }
1222
1223 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001224 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001225 enumeratorString += string;
1226
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001227 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001228 enumeratorString += '|';
1229 }
1230 }
1231
1232 return enumeratorString;
1233}
1234
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001235static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001236 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001237 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001238 return false;
1239 }
1240
1241 return true;
1242}
1243
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001244static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1245 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001246 return "unrecognized enumerator";
1247 }
1248
1249 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001250 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001251 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001252 }
1253
1254 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001255 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001256 enumeratorString += string;
1257
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001258 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001259 enumeratorString += '|';
1260 }
1261 }
1262
1263 return enumeratorString;
1264}
1265
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001266static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1267 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1268 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1269 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001270 return false;
1271 }
1272
1273 return true;
1274}
1275
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001276static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1277 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001278 return "unrecognized enumerator";
1279 }
1280
1281 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001282 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001283 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1284 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001285 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001286 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1287 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001288 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001289 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1290 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001291 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001292 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1293 }
1294
1295 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001296 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001297 enumeratorString += string;
1298
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001299 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001300 enumeratorString += '|';
1301 }
1302 }
1303
1304 return enumeratorString;
1305}
1306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001307static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001308 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001309 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001310 return false;
1311 }
1312
1313 return true;
1314}
1315
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001316static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1317 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001318 return "unrecognized enumerator";
1319 }
1320
1321 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001322 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001323 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001324 }
1325
1326 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001327 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001328 enumeratorString += string;
1329
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001330 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001331 enumeratorString += '|';
1332 }
1333 }
1334
1335 return enumeratorString;
1336}
1337
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001338static const int MaxParamCheckerStringLength = 256;
1339
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001340static VkBool32 validate_string(layer_data *my_data, const char *apiName, const char *stringName, const char *validateString) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001341 VkBool32 skipCall = VK_FALSE;
1342
1343 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1344
1345 if (result == VK_STRING_ERROR_NONE) {
1346 return skipCall;
1347 } else if (result & VK_STRING_ERROR_LENGTH) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001348 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1349 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001350 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001351 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1352 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001353 }
1354 return skipCall;
1355}
1356
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001357VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1358vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001359 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001360
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001361 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Graves842621d2016-03-03 14:17:08 -07001362 assert(chain_info->u.pLayerInfo);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001363 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1364 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001365 if (fpCreateInstance == NULL) {
1366 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001367 }
1368
Dustin Graves842621d2016-03-03 14:17:08 -07001369 // Advance the link info for the next element on the chain
1370 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1371
1372 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
1373 if (result != VK_SUCCESS) {
1374 return result;
1375 }
1376
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001377 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1378 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001379
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001380 my_data->report_data =
1381 debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001382
1383 InitParamChecker(my_data, pAllocator);
1384
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001385 // Ordinarily we'd check these before calling down the chain, but none of the layer
1386 // support is in place until now, if we survive we can report the issue now.
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001387 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001388
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001389 param_check_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001390
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001391 if (pCreateInfo->pApplicationInfo) {
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001392 if (pCreateInfo->pApplicationInfo->pApplicationName) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001393 validate_string(my_instance_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pApplicationName",
1394 pCreateInfo->pApplicationInfo->pApplicationName);
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001395 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001396
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001397 if (pCreateInfo->pApplicationInfo->pEngineName) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001398 validate_string(my_instance_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pEngineName",
1399 pCreateInfo->pApplicationInfo->pEngineName);
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001400 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001401 }
1402
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001403 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001404}
1405
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001406VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001407 // Grab the key before the instance is destroyed.
1408 dispatch_key key = get_dispatch_key(instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001409 VkBool32 skipCall = VK_FALSE;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001410 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001411 assert(my_data != NULL);
1412
1413 skipCall |= param_check_vkDestroyInstance(my_data->report_data, pAllocator);
1414
1415 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001416 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001417 pTable->DestroyInstance(instance, pAllocator);
1418
1419 // Clean up logging callback, if any
1420 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001421 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1422 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001423 my_data->logging_callback.pop_back();
1424 }
1425
1426 layer_debug_report_destroy_instance(mid(instance));
1427 layer_data_map.erase(pTable);
1428
1429 pc_instance_table_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001430 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001431}
1432
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001433bool PostEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices,
1434 VkResult result) {
1435 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001436 std::string reason = "vkEnumeratePhysicalDevices parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001437 log_msg(mid(instance), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1438 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001439 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001440 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001441
1442 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001443}
1444
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001445VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1446vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1447 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1448 VkBool32 skipCall = VK_FALSE;
1449 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001451
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001452 skipCall |= param_check_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453
1454 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001455 result = get_dispatch_table(pc_instance_table_map, instance)
1456 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001457
1458 PostEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices, result);
1459 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001460
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001461 return result;
1462}
1463
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001464VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1465vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1466 VkBool32 skipCall = VK_FALSE;
1467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001469
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001470 skipCall |= param_check_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471
1472 if (skipCall == VK_FALSE) {
1473 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001474 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001475}
1476
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001477bool PostGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1478 VkFormatProperties *pFormatProperties) {
Jeremy Hayes99a96322015-06-26 12:48:09 -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 "vkGetPhysicalDeviceFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001483 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001484 }
1485
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001486 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001487}
1488
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001489VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1490vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
1491 VkBool32 skipCall = VK_FALSE;
1492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001494
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001495 skipCall |= param_check_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496
1497 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001498 get_dispatch_table(pc_instance_table_map, physicalDevice)
1499 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001500
1501 PostGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
1502 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001503}
1504
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001505bool PostGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1506 VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
1507 VkImageFormatProperties *pImageFormatProperties, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001508
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001509 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001510 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001511 "vkGetPhysicalDeviceImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001512 return false;
1513 }
1514
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001515 if (type < VK_IMAGE_TYPE_BEGIN_RANGE || type > VK_IMAGE_TYPE_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001516 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001517 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001518 return false;
1519 }
1520
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001521 if (tiling < VK_IMAGE_TILING_BEGIN_RANGE || tiling > VK_IMAGE_TILING_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001522 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001523 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001524 return false;
1525 }
1526
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001527 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001528 std::string reason = "vkGetPhysicalDeviceImageFormatProperties parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001529 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1530 "%s", reason.c_str());
Chia-I Wu17241042015-10-31 00:31:16 +08001531 return false;
1532 }
1533
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001534 return true;
1535}
1536
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001537VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1538vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1539 VkImageUsageFlags usage, VkImageCreateFlags flags,
1540 VkImageFormatProperties *pImageFormatProperties) {
1541 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1542 VkBool32 skipCall = VK_FALSE;
1543 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001544 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001545
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001546 skipCall |= param_check_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
1547 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001548
1549 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001550 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1551 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1552 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001553
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001554 PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties,
1555 result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001556 }
Chia-I Wu17241042015-10-31 00:31:16 +08001557
1558 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001559}
1560
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001561bool PostGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001562
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001563 if (pProperties != nullptr) {
1564 if (pProperties->deviceType < VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE ||
1565 pProperties->deviceType > VK_PHYSICAL_DEVICE_TYPE_END_RANGE) {
1566 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1567 "vkGetPhysicalDeviceProperties parameter, VkPhysicalDeviceType pProperties->deviceType, is an unrecognized "
1568 "enumerator");
1569 return false;
1570 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001571 }
1572
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001573 return true;
1574}
1575
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001576VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1577vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1578 VkBool32 skipCall = VK_FALSE;
1579 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001580 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001581
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001582 skipCall |= param_check_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001583
1584 if (skipCall == VK_FALSE) {
1585 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
1586
1587 PostGetPhysicalDeviceProperties(physicalDevice, pProperties);
1588 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001589}
1590
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001591VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1592vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1593 VkQueueFamilyProperties *pQueueFamilyProperties) {
1594 VkBool32 skipCall = VK_FALSE;
1595 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001596 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001597
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001598 skipCall |= param_check_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1599 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001600
1601 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001602 get_dispatch_table(pc_instance_table_map, physicalDevice)
1603 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001604 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001605}
1606
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001607VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1608vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1609 VkBool32 skipCall = VK_FALSE;
1610 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001611 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001612
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001613 skipCall |= param_check_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001614
1615 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001616 get_dispatch_table(pc_instance_table_map, physicalDevice)
1617 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001618 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001619}
1620
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001621void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1622 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001623 std::unordered_set<uint32_t> set;
1624 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1625 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001626 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001627 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1628 "structure.",
1629 i);
Michael Lentine157a2ec2016-01-27 11:25:05 -06001630 } else {
1631 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
1632 }
Michael Lentine26244832016-01-27 11:40:27 -06001633 if (pCreateInfo->pQueueCreateInfos[i].queueCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001634 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001635 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount, cannot be zero.", i);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001636 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001637 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001638 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f ||
1639 pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f) {
1640 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1641 "PARAMCHECK", "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1642 "between 0 and 1. Actual value is %f",
1643 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001644 }
Michael Lentine26244832016-01-27 11:40:27 -06001645 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001646 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1647 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001648 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1649 "of queue families.",
1650 i);
1651 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1652 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001653 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001654 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1655 "queues for the given family index.",
1656 i);
Michael Lentine774704f2016-01-27 13:36:46 -06001657 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001658 }
1659}
1660
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001661void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001662 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001663 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1664 my_device_data->queueFamilyIndexMap.insert(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001665 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
Michael Lentinebdf744f2016-01-27 15:43:43 -06001666 }
1667}
1668
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001669VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1670 const VkDeviceCreateInfo *pCreateInfo,
1671 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001672 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001673 * NOTE: We do not validate physicalDevice or any dispatchable
1674 * object as the first parameter. We couldn't get here if it was wrong!
1675 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001676
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001677 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1678 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001679 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001680
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001681 skipCall |= param_check_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001682
Dustin Graves1e92cd72016-02-09 14:00:18 -07001683 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
1684 for (auto i = 0; i < pCreateInfo->enabledLayerCount; i++) {
1685 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledLayerNames",
1686 pCreateInfo->ppEnabledLayerNames[i]);
1687 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001688 }
Michael Lentine774704f2016-01-27 13:36:46 -06001689
Dustin Graves1e92cd72016-02-09 14:00:18 -07001690 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
1691 for (auto i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1692 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledExtensionNames",
1693 pCreateInfo->ppEnabledExtensionNames[i]);
1694 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001695 }
1696
1697 if (skipCall == VK_FALSE) {
1698 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
1699 assert(chain_info->u.pLayerInfo);
1700 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1701 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001702 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001703 if (fpCreateDevice == NULL) {
1704 return VK_ERROR_INITIALIZATION_FAILED;
1705 }
1706
1707 // Advance the link info for the next element on the chain
1708 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1709
1710 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
1711 if (result != VK_SUCCESS) {
1712 return result;
1713 }
1714
1715 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1716 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1717 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1718
1719 uint32_t count;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001720 get_dispatch_table(pc_instance_table_map, physicalDevice)
1721 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001722 std::vector<VkQueueFamilyProperties> properties(count);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001723 get_dispatch_table(pc_instance_table_map, physicalDevice)
1724 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001725
1726 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1727 storeCreateDeviceData(*pDevice, pCreateInfo);
1728 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001729
Jeremy Hayes99a96322015-06-26 12:48:09 -06001730 return result;
1731}
1732
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001733VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001734 dispatch_key key = get_dispatch_key(device);
Dustin Graves27a912a2016-03-07 17:52:14 -07001735 VkBool32 skipCall = VK_FALSE;
1736 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1737 assert(my_data != NULL);
1738
1739 skipCall |= param_check_vkDestroyDevice(my_data->report_data, pAllocator);
1740
1741 if (skipCall == VK_FALSE) {
1742 layer_debug_report_destroy_device(device);
1743
Jeremy Hayes99a96322015-06-26 12:48:09 -06001744#if DISPATCH_MAP_DEBUG
Dustin Graves27a912a2016-03-07 17:52:14 -07001745 fprintf(stderr, "Device: %p, key: %p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001746#endif
1747
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001748 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001749 pc_device_table_map.erase(key);
1750 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001751}
1752
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001753bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001754 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1755 auto queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001756 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001757 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001758 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.",
1759 queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001760 return false;
1761 }
1762 if (queue_data->second <= queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001763 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001764 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1765 "was created.",
1766 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001767 return false;
1768 }
1769 return true;
1770}
1771
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001772VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1773vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1774 VkBool32 skipCall = VK_FALSE;
1775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001776 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001777
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001778 skipCall |= param_check_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001779
Dustin Graves1e92cd72016-02-09 14:00:18 -07001780 if (skipCall == VK_FALSE) {
1781 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1782
1783 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001784 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001785}
1786
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001787bool PostQueueSubmit(VkQueue queue, uint32_t commandBufferCount, VkFence fence, VkResult result) {
1788 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001789 std::string reason = "vkQueueSubmit parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001790 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1791 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001792 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001793 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001794
1795 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001796}
1797
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001798VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1799vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1800 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1801 VkBool32 skipCall = VK_FALSE;
1802 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001803 assert(my_data != NULL);
1804
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001805 skipCall |= param_check_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001806
1807 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001808 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1809
1810 PostQueueSubmit(queue, submitCount, fence, result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001811 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001812
Jeremy Hayes99a96322015-06-26 12:48:09 -06001813 return result;
1814}
1815
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001816bool PostQueueWaitIdle(VkQueue queue, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001818 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001819 std::string reason = "vkQueueWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001820 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1821 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001822 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001823 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001824
1825 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001826}
1827
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001828VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001829 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001830
1831 PostQueueWaitIdle(queue, result);
1832
1833 return result;
1834}
1835
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001836bool PostDeviceWaitIdle(VkDevice device, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001837
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001838 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001839 std::string reason = "vkDeviceWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001840 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1841 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001842 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001843 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001844
1845 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001846}
1847
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001848VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001849 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001850
1851 PostDeviceWaitIdle(device, result);
1852
1853 return result;
1854}
1855
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001856bool PostAllocateMemory(VkDevice device, VkDeviceMemory *pMemory, VkResult result) {
1857 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001858 std::string reason = "vkAllocateMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001859 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1860 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001861 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001862 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001863
1864 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001865}
1866
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001867VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1868 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1870 VkBool32 skipCall = VK_FALSE;
1871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001873
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001874 skipCall |= param_check_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001875
Dustin Graves1e92cd72016-02-09 14:00:18 -07001876 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1878
1879 PostAllocateMemory(device, pMemory, result);
1880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001881
1882 return result;
1883}
1884
Dustin Graves27a912a2016-03-07 17:52:14 -07001885VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001886vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001887 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001888 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001889 assert(my_data != NULL);
1890
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001891 skipCall |= param_check_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001892
1893 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001894 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001895 }
1896}
1897
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001898bool PostMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags,
1899 void **ppData, VkResult result) {
1900 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001901 std::string reason = "vkMapMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001902 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1903 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001904 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001905 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001906
1907 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001908}
1909
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001910VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1911vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1912 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1913 VkBool32 skipCall = VK_FALSE;
1914 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001915 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001916
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001917 skipCall |= param_check_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001918
1919 if (skipCall == VK_FALSE) {
1920 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1921
1922 PostMapMemory(device, memory, offset, size, flags, ppData, result);
1923 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001924
1925 return result;
1926}
1927
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001928bool PostFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001929
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001930 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001931 std::string reason = "vkFlushMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001932 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1933 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001934 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001935 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001936
1937 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001938}
1939
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001940VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1941vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1942 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1943 VkBool32 skipCall = VK_FALSE;
1944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001945 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001946
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001947 skipCall |= param_check_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001948
Dustin Graves1e92cd72016-02-09 14:00:18 -07001949 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001950 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1951
1952 PostFlushMappedMemoryRanges(device, memoryRangeCount, result);
1953 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001954
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001955 return result;
1956}
1957
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001958bool PostInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001959
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001960 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001961 std::string reason = "vkInvalidateMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001962 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
1963 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001964 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001965 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001966
1967 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001968}
1969
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001970VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1971vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1972 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1973 VkBool32 skipCall = VK_FALSE;
1974 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001975 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001976
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977 skipCall |= param_check_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001978
Dustin Graves1e92cd72016-02-09 14:00:18 -07001979 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 result =
1981 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982
1983 PostInvalidateMappedMemoryRanges(device, memoryRangeCount, result);
1984 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001985
Tony Barbourb1250542015-04-16 19:23:13 -06001986 return result;
1987}
1988
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001989VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1990vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
1991 VkBool32 skipCall = VK_FALSE;
1992 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001994
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001995 skipCall |= param_check_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001996
1997 if (skipCall == VK_FALSE) {
1998 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002000}
2001
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002002bool PostBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002003
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002004 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002005 std::string reason = "vkBindBufferMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2007 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002008 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002009 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002010
2011 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002012}
2013
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002014VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2015vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002016 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, mem, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002017
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002018 PostBindBufferMemory(device, buffer, mem, memoryOffset, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002019
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002020 return result;
2021}
2022
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002023bool PostBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memoryOffset, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002024
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002025 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002026 std::string reason = "vkBindImageMemory parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002027 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2028 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002029 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002030 }
2031
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002032 return true;
2033}
2034
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002035VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2036vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002037 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, mem, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002038
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002039 PostBindImageMemory(device, image, mem, memoryOffset, result);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002040
2041 return result;
2042}
2043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2045vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
2046 VkBool32 skipCall = VK_FALSE;
2047 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002048 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002049
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002050 skipCall |= param_check_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002051
2052 if (skipCall == VK_FALSE) {
2053 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002054 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002055}
2056
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002057VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2058vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
2059 VkBool32 skipCall = VK_FALSE;
2060 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002061 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002062
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002063 skipCall |= param_check_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002064
2065 if (skipCall == VK_FALSE) {
2066 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002067 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002068}
2069
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2071 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2072 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002073 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002074 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2075 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002076 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002077 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2078 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002079 return false;
2080 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002081 }
2082
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002083 return true;
2084}
2085
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002086VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2087vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2088 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2089 VkBool32 skipCall = VK_FALSE;
2090 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002091 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002092
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002093 skipCall |= param_check_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2094 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002095
2096 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002097 get_dispatch_table(pc_device_table_map, device)
2098 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002099
2100 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2101 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002102}
2103
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002104bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2105 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2106 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002107
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002108 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002109 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002110 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002111 return false;
2112 }
2113
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002114 if (type < VK_IMAGE_TYPE_BEGIN_RANGE || type > VK_IMAGE_TYPE_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002115 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002116 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002117 return false;
2118 }
2119
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002120 if (tiling < VK_IMAGE_TILING_BEGIN_RANGE || tiling > VK_IMAGE_TILING_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002121 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002122 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002123 return false;
2124 }
2125
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002126 if (pProperties != nullptr) {
2127 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2128 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002129 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002130 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2131 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002132 return false;
2133 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002134 }
2135
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002136 return true;
2137}
2138
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002139VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2140vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2141 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2142 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
2143 VkBool32 skipCall = VK_FALSE;
2144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002145 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002147 skipCall |= param_check_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
2148 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002149
2150 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002151 get_dispatch_table(pc_instance_table_map, physicalDevice)
2152 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2153 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002154
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002155 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2156 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002157 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002158}
2159
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002160bool PostQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002161
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002162 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002163 std::string reason = "vkQueueBindSparse parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002164 log_msg(mdd(queue), 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;
2167 }
2168
2169 return true;
2170}
2171
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002172VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2173vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
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(queue), 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_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -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, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2183
2184 PostQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
2185 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002186
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002187 return result;
2188}
2189
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002190bool PostCreateFence(VkDevice device, VkFence *pFence, VkResult result) {
2191 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002192 std::string reason = "vkCreateFence parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002193 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2194 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002195 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002196 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002197
2198 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002199}
2200
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002201VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2202vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2203 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2204 VkBool32 skipCall = VK_FALSE;
2205 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002206 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002207
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002208 skipCall |= param_check_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002209
Dustin Graves1e92cd72016-02-09 14:00:18 -07002210 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002211 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2212
2213 PostCreateFence(device, pFence, result);
2214 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002215
2216 return result;
2217}
2218
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002219VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002220 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002221 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002222 assert(my_data != NULL);
2223
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002224 skipCall |= param_check_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002225
2226 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002227 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002228 }
2229}
2230
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002231bool PostResetFences(VkDevice device, uint32_t fenceCount, 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 = "vkResetFences 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 vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2244 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2245 VkBool32 skipCall = VK_FALSE;
2246 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002247 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002248
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002249 skipCall |= param_check_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002250
Dustin Graves1e92cd72016-02-09 14:00:18 -07002251 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002252 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2253
2254 PostResetFences(device, fenceCount, result);
2255 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002256
2257 return result;
2258}
2259
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002260bool PostGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002261
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002262 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002263 std::string reason = "vkGetFenceStatus parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002264 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2265 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002266 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002267 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002268
2269 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002270}
2271
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002272VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002273 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002274
2275 PostGetFenceStatus(device, fence, result);
2276
2277 return result;
2278}
2279
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002280bool PostWaitForFences(VkDevice device, uint32_t fenceCount, VkBool32 waitAll, uint64_t timeout, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002281
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002282 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002283 std::string reason = "vkWaitForFences 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
2293vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
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_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
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)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2303
2304 PostWaitForFences(device, fenceCount, waitAll, timeout, result);
2305 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002306
2307 return result;
2308}
2309
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002310bool PostCreateSemaphore(VkDevice device, VkSemaphore *pSemaphore, VkResult result) {
2311 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002312 std::string reason = "vkCreateSemaphore parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002313 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2314 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002315 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002316 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002317
2318 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002319}
2320
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002321VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2322 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2323 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2324 VkBool32 skipCall = VK_FALSE;
2325 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002326 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002327
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002328 skipCall |= param_check_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002329
Dustin Graves1e92cd72016-02-09 14:00:18 -07002330 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002331 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2332
2333 PostCreateSemaphore(device, pSemaphore, result);
2334 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002335
2336 return result;
2337}
2338
Dustin Graves27a912a2016-03-07 17:52:14 -07002339VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002341 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002342 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002343 assert(my_data != NULL);
2344
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002345 skipCall |= param_check_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002346
2347 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002348 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002349 }
2350}
2351
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002352bool PostCreateEvent(VkDevice device, VkEvent *pEvent, VkResult result) {
2353 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002354 std::string reason = "vkCreateEvent parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002355 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2356 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002357 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002358 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002359
2360 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002361}
2362
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002363VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2364vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2365 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2366 VkBool32 skipCall = VK_FALSE;
2367 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002368 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002369
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002370 skipCall |= param_check_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002371
Dustin Graves1e92cd72016-02-09 14:00:18 -07002372 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002373 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2374
2375 PostCreateEvent(device, pEvent, result);
2376 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002377
2378 return result;
2379}
2380
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002381VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002382 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002383 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002384 assert(my_data != NULL);
2385
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002386 skipCall |= param_check_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002387
2388 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002389 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002390 }
2391}
2392
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002393bool PostGetEventStatus(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002394
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002395 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002396 std::string reason = "vkGetEventStatus parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002397 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2398 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002399 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002400 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002401
2402 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002403}
2404
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002405VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002406 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002407
2408 PostGetEventStatus(device, event, result);
2409
2410 return result;
2411}
2412
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002413bool PostSetEvent(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002414
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002415 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002416 std::string reason = "vkSetEvent parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002417 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2418 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002419 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002420 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002421
2422 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002423}
2424
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002425VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002426 VkResult result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002427
2428 PostSetEvent(device, event, result);
2429
2430 return result;
2431}
2432
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002433bool PostResetEvent(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002434
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002435 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002436 std::string reason = "vkResetEvent parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002437 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2438 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002439 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002440 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002441
2442 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002443}
2444
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002445VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002446 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002447
2448 PostResetEvent(device, event, result);
2449
2450 return result;
2451}
2452
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002453bool PreCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo) {
2454 if (pCreateInfo != nullptr) {
2455 if (pCreateInfo->queryType < VK_QUERY_TYPE_BEGIN_RANGE || pCreateInfo->queryType > VK_QUERY_TYPE_END_RANGE) {
2456 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2457 "vkCreateQueryPool parameter, VkQueryType pCreateInfo->queryType, is an unrecognized enumerator");
2458 return false;
2459 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002460 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002461
2462 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002463}
2464
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002465bool PostCreateQueryPool(VkDevice device, VkQueryPool *pQueryPool, VkResult result) {
2466 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002467 std::string reason = "vkCreateQueryPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002468 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2469 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002470 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002471 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002472
2473 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002474}
2475
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002476VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2477 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2478 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2479 VkBool32 skipCall = VK_FALSE;
2480 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002481 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002482
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002483 skipCall |= param_check_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002484
Dustin Graves1e92cd72016-02-09 14:00:18 -07002485 if (skipCall == VK_FALSE) {
2486 PreCreateQueryPool(device, pCreateInfo);
2487
2488 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2489
2490 PostCreateQueryPool(device, pQueryPool, result);
2491 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002492
2493 return result;
2494}
2495
Dustin Graves27a912a2016-03-07 17:52:14 -07002496VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002497vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002498 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002499 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002500 assert(my_data != NULL);
2501
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002502 skipCall |= param_check_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002503
2504 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002505 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002506 }
2507}
2508
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002509bool PostGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize,
2510 void *pData, VkDeviceSize stride, VkQueryResultFlags flags, VkResult result) {
2511 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002512 std::string reason = "vkGetQueryPoolResults parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002513 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2514 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002515 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002516 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002517
2518 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002519}
2520
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002521VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2522 uint32_t queryCount, size_t dataSize, void *pData,
2523 VkDeviceSize stride, VkQueryResultFlags flags) {
2524 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2525 VkBool32 skipCall = VK_FALSE;
2526 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002527 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002528
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002529 skipCall |=
2530 param_check_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002531
2532 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002533 result = get_dispatch_table(pc_device_table_map, device)
2534 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002535
2536 PostGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags, result);
2537 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002538
2539 return result;
2540}
2541
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002542bool PreCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo) {
2543 if (pCreateInfo != nullptr) {
2544 if (pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE || pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE) {
2545 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2546 "vkCreateBuffer parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
2547 return false;
2548 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002549 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002550
2551 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002552}
2553
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002554bool PostCreateBuffer(VkDevice device, VkBuffer *pBuffer, VkResult result) {
2555 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002556 std::string reason = "vkCreateBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002557 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2558 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002559 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002560 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002561
2562 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002563}
2564
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002565VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2566vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2567 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2568 VkBool32 skipCall = VK_FALSE;
2569 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002570 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002571
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002572 skipCall |= param_check_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002573
Dustin Graves1e92cd72016-02-09 14:00:18 -07002574 if (skipCall == VK_FALSE) {
2575 PreCreateBuffer(device, pCreateInfo);
2576
2577 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2578
2579 PostCreateBuffer(device, pBuffer, result);
2580 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002581
2582 return result;
2583}
2584
Dustin Graves27a912a2016-03-07 17:52:14 -07002585VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002586vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002587 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002589 assert(my_data != NULL);
2590
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002591 skipCall |= param_check_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002592
2593 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002594 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002595 }
2596}
2597
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002598bool PreCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo) {
2599 if (pCreateInfo != nullptr) {
2600 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE || pCreateInfo->format > VK_FORMAT_END_RANGE) {
2601 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2602 "vkCreateBufferView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
2603 return false;
2604 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002605 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002606
2607 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002608}
2609
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002610bool PostCreateBufferView(VkDevice device, VkBufferView *pView, VkResult result) {
2611 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002612 std::string reason = "vkCreateBufferView parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002613 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2614 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002615 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002616 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002617
2618 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002619}
2620
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002621VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2622 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2623 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2624 VkBool32 skipCall = VK_FALSE;
2625 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002626 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002627
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002628 skipCall |= param_check_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002629
Dustin Graves1e92cd72016-02-09 14:00:18 -07002630 if (skipCall == VK_FALSE) {
2631 PreCreateBufferView(device, pCreateInfo);
2632
2633 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2634
2635 PostCreateBufferView(device, pView, result);
2636 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002637
2638 return result;
2639}
2640
Dustin Graves27a912a2016-03-07 17:52:14 -07002641VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002642vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002643 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002644 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002645 assert(my_data != NULL);
2646
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002647 skipCall |= param_check_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002648
2649 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002650 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002651 }
2652}
2653
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002654bool PreCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo) {
2655 if (pCreateInfo != nullptr) {
2656 if (pCreateInfo->imageType < VK_IMAGE_TYPE_BEGIN_RANGE || pCreateInfo->imageType > VK_IMAGE_TYPE_END_RANGE) {
2657 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2658 "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is an unrecognized enumerator");
2659 return false;
2660 }
2661 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE || pCreateInfo->format > VK_FORMAT_END_RANGE) {
2662 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2663 "vkCreateImage parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
2664 return false;
2665 }
2666 if (pCreateInfo->tiling < VK_IMAGE_TILING_BEGIN_RANGE || pCreateInfo->tiling > VK_IMAGE_TILING_END_RANGE) {
2667 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2668 "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is an unrecognized enumerator");
2669 return false;
2670 }
2671 if (pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE || pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE) {
2672 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2673 "vkCreateImage parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
2674 return false;
2675 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002676 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002677
2678 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002679}
2680
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002681bool PostCreateImage(VkDevice device, VkImage *pImage, VkResult result) {
2682 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002683 std::string reason = "vkCreateImage parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2685 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002686 return false;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002687 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002688
2689 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002690}
2691
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002692VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2693vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2694 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2695 VkBool32 skipCall = VK_FALSE;
2696 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002697 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002698
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002699 skipCall |= param_check_vkCreateImage(my_data->report_data, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002700
Dustin Graves1e92cd72016-02-09 14:00:18 -07002701 if (skipCall == VK_FALSE) {
2702 PreCreateImage(device, pCreateInfo);
2703
2704 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2705
2706 PostCreateImage(device, pImage, result);
2707 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002708
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002709 return result;
2710}
2711
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002713 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002715 assert(my_data != NULL);
2716
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002717 skipCall |= param_check_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002718
2719 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002721 }
2722}
2723
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002724bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2725 if (pSubresource != nullptr) {
2726 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2727 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
2728 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2729 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2730 return false;
2731 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002732 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002733
2734 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002735}
2736
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002737VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2738vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
2739 VkBool32 skipCall = VK_FALSE;
2740 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002741 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002742
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002743 skipCall |= param_check_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002744
Dustin Graves1e92cd72016-02-09 14:00:18 -07002745 if (skipCall == VK_FALSE) {
2746 PreGetImageSubresourceLayout(device, pSubresource);
2747
2748 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002749 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002750}
2751
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002752bool PreCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo) {
2753 if (pCreateInfo != nullptr) {
2754 if (pCreateInfo->viewType < VK_IMAGE_VIEW_TYPE_BEGIN_RANGE || pCreateInfo->viewType > VK_IMAGE_VIEW_TYPE_END_RANGE) {
2755 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2756 "vkCreateImageView parameter, VkImageViewType pCreateInfo->viewType, is an unrecognized enumerator");
2757 return false;
2758 }
2759 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE || pCreateInfo->format > VK_FORMAT_END_RANGE) {
2760 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2761 "vkCreateImageView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
2762 return false;
2763 }
2764 if (pCreateInfo->components.r < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2765 pCreateInfo->components.r > VK_COMPONENT_SWIZZLE_END_RANGE) {
2766 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2767 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.r, is an unrecognized enumerator");
2768 return false;
2769 }
2770 if (pCreateInfo->components.g < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2771 pCreateInfo->components.g > VK_COMPONENT_SWIZZLE_END_RANGE) {
2772 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2773 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.g, is an unrecognized enumerator");
2774 return false;
2775 }
2776 if (pCreateInfo->components.b < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2777 pCreateInfo->components.b > VK_COMPONENT_SWIZZLE_END_RANGE) {
2778 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2779 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.b, is an unrecognized enumerator");
2780 return false;
2781 }
2782 if (pCreateInfo->components.a < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
2783 pCreateInfo->components.a > VK_COMPONENT_SWIZZLE_END_RANGE) {
2784 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2785 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.a, is an unrecognized enumerator");
2786 return false;
2787 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002788 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002789
2790 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002791}
2792
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002793bool PostCreateImageView(VkDevice device, VkImageView *pView, VkResult result) {
2794 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002795 std::string reason = "vkCreateImageView parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002796 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2797 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002798 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002799 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002800
2801 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002802}
2803
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002804VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2805 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2806 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2807 VkBool32 skipCall = VK_FALSE;
2808 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002809 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002810
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002811 skipCall |= param_check_vkCreateImageView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002812
Dustin Graves1e92cd72016-02-09 14:00:18 -07002813 if (skipCall == VK_FALSE) {
2814 PreCreateImageView(device, pCreateInfo);
2815
2816 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2817
2818 PostCreateImageView(device, pView, result);
2819 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002820
2821 return result;
2822}
2823
Dustin Graves27a912a2016-03-07 17:52:14 -07002824VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002825vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002826 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002828 assert(my_data != NULL);
2829
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002830 skipCall |= param_check_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002831
2832 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002833 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002834 }
2835}
2836
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002837bool PostCreateShaderModule(VkDevice device, VkShaderModule *pShaderModule, VkResult result) {
2838 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002839 std::string reason = "vkCreateShaderModule parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002840 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2841 reason.c_str());
Michael Lentine03d8e572015-09-15 14:59:14 -05002842 return false;
2843 }
2844
2845 return true;
2846}
2847
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002848VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2849 const VkAllocationCallbacks *pAllocator,
2850 VkShaderModule *pShaderModule) {
2851 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2852 VkBool32 skipCall = VK_FALSE;
2853 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002854 assert(my_data != NULL);
2855
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002856 skipCall |= param_check_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002857
2858 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002859 result =
2860 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002861
2862 PostCreateShaderModule(device, pShaderModule, result);
2863 }
2864
Michael Lentine03d8e572015-09-15 14:59:14 -05002865 return result;
2866}
2867
Dustin Graves27a912a2016-03-07 17:52:14 -07002868VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002869vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002870 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002872 assert(my_data != NULL);
2873
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002874 skipCall |= param_check_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002875
2876 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002877 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002878 }
2879}
2880
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002881bool PostCreatePipelineCache(VkDevice device, VkPipelineCache *pPipelineCache, VkResult result) {
2882 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002883 std::string reason = "vkCreatePipelineCache parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002884 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2885 reason.c_str());
Tony Barbourdd6e32e2015-07-10 15:29:03 -06002886 return false;
2887 }
2888
2889 return true;
2890}
2891
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002892VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2893 const VkAllocationCallbacks *pAllocator,
2894 VkPipelineCache *pPipelineCache) {
2895 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2896 VkBool32 skipCall = VK_FALSE;
2897 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002898 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002899
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002900 skipCall |= param_check_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002901
Dustin Graves1e92cd72016-02-09 14:00:18 -07002902 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002903 result =
2904 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002905
2906 PostCreatePipelineCache(device, pPipelineCache, result);
2907 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002908
2909 return result;
2910}
2911
Dustin Graves27a912a2016-03-07 17:52:14 -07002912VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002913vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07002914 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002915 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002916 assert(my_data != NULL);
2917
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002918 skipCall |= param_check_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002919
2920 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002921 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002922 }
2923}
2924
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002925bool PostGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData, VkResult result) {
2926 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002927 std::string reason = "vkGetPipelineCacheData parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002928 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2929 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002930 return false;
2931 }
2932
2933 return true;
2934}
2935
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002936VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2937vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2938 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2939 VkBool32 skipCall = VK_FALSE;
2940 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002941 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002942
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002943 skipCall |= param_check_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002944
2945 if (skipCall == VK_FALSE) {
2946 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2947
2948 PostGetPipelineCacheData(device, pipelineCache, pDataSize, pData, result);
2949 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002950
2951 return result;
2952}
2953
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002954bool PostMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002955
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002956 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002957 std::string reason = "vkMergePipelineCaches parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002958 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
2959 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002960 return false;
2961 }
2962
2963 return true;
2964}
2965
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002966VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2967vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2968 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2969 VkBool32 skipCall = VK_FALSE;
2970 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002971 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002972
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002973 skipCall |= param_check_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002974
Dustin Graves1e92cd72016-02-09 14:00:18 -07002975 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002976 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2977
2978 PostMergePipelineCaches(device, dstCache, srcCacheCount, result);
2979 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002980
2981 return result;
2982}
2983
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002984bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002985 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2986
2987 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002988 if (pCreateInfos != nullptr) {
2989 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2990 if (pCreateInfos->basePipelineIndex != -1) {
2991 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2992 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2993 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2994 "pCreateInfos->flags "
2995 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2996 return false;
2997 }
2998 }
2999
3000 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
3001 if (pCreateInfos->basePipelineIndex != -1) {
3002 log_msg(
3003 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3004 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
3005 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
3006 "VK_NULL_HANDLE");
3007 return false;
3008 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003009 }
3010 }
3011
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003012 if (pCreateInfos->pVertexInputState != nullptr) {
3013 if (pCreateInfos->pVertexInputState->pVertexBindingDescriptions != nullptr) {
3014 if (pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate < VK_VERTEX_INPUT_RATE_BEGIN_RANGE ||
3015 pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate > VK_VERTEX_INPUT_RATE_END_RANGE) {
3016 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3017 "vkCreateGraphicsPipelines parameter, VkVertexInputRate "
3018 "pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate, is an unrecognized "
3019 "enumerator");
3020 return false;
3021 }
3022 }
3023 if (pCreateInfos->pVertexInputState->pVertexAttributeDescriptions != nullptr) {
3024 if (pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format < VK_FORMAT_BEGIN_RANGE ||
3025 pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format > VK_FORMAT_END_RANGE) {
3026 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3027 "vkCreateGraphicsPipelines parameter, VkFormat "
3028 "pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format, is an unrecognized enumerator");
3029 return false;
3030 }
3031 }
3032 }
3033 if (pCreateInfos->pInputAssemblyState != nullptr) {
3034 if (pCreateInfos->pInputAssemblyState->topology < VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE ||
3035 pCreateInfos->pInputAssemblyState->topology > VK_PRIMITIVE_TOPOLOGY_END_RANGE) {
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003036 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003037 "vkCreateGraphicsPipelines parameter, VkPrimitiveTopology pCreateInfos->pInputAssemblyState->topology, is "
3038 "an unrecognized enumerator");
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003039 return false;
3040 }
3041 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003042 if (pCreateInfos->pRasterizationState != nullptr) {
3043 if (pCreateInfos->pRasterizationState->polygonMode < VK_POLYGON_MODE_BEGIN_RANGE ||
3044 pCreateInfos->pRasterizationState->polygonMode > VK_POLYGON_MODE_END_RANGE) {
3045 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3046 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode, is an "
3047 "unrecognized enumerator");
3048 return false;
3049 }
3050 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
3051 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3052 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
3053 "unrecognized enumerator");
3054 return false;
3055 }
3056 if (pCreateInfos->pRasterizationState->frontFace < VK_FRONT_FACE_BEGIN_RANGE ||
3057 pCreateInfos->pRasterizationState->frontFace > VK_FRONT_FACE_END_RANGE) {
3058 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3059 "vkCreateGraphicsPipelines parameter, VkFrontFace pCreateInfos->pRasterizationState->frontFace, is an "
3060 "unrecognized enumerator");
3061 return false;
3062 }
3063 }
3064 if (pCreateInfos->pDepthStencilState != nullptr) {
3065 if (pCreateInfos->pDepthStencilState->depthCompareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3066 pCreateInfos->pDepthStencilState->depthCompareOp > VK_COMPARE_OP_END_RANGE) {
3067 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3068 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->depthCompareOp, is an "
3069 "unrecognized enumerator");
3070 return false;
3071 }
3072 if (pCreateInfos->pDepthStencilState->front.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
3073 pCreateInfos->pDepthStencilState->front.failOp > VK_STENCIL_OP_END_RANGE) {
3074 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3075 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.failOp, is an "
3076 "unrecognized enumerator");
3077 return false;
3078 }
3079 if (pCreateInfos->pDepthStencilState->front.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
3080 pCreateInfos->pDepthStencilState->front.passOp > VK_STENCIL_OP_END_RANGE) {
3081 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3082 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.passOp, is an "
3083 "unrecognized enumerator");
3084 return false;
3085 }
3086 if (pCreateInfos->pDepthStencilState->front.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
3087 pCreateInfos->pDepthStencilState->front.depthFailOp > VK_STENCIL_OP_END_RANGE) {
3088 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3089 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.depthFailOp, is "
3090 "an unrecognized enumerator");
3091 return false;
3092 }
3093 if (pCreateInfos->pDepthStencilState->front.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3094 pCreateInfos->pDepthStencilState->front.compareOp > VK_COMPARE_OP_END_RANGE) {
3095 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3096 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->front.compareOp, is an "
3097 "unrecognized enumerator");
3098 return false;
3099 }
3100 if (pCreateInfos->pDepthStencilState->back.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
3101 pCreateInfos->pDepthStencilState->back.failOp > VK_STENCIL_OP_END_RANGE) {
3102 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3103 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.failOp, is an "
3104 "unrecognized enumerator");
3105 return false;
3106 }
3107 if (pCreateInfos->pDepthStencilState->back.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
3108 pCreateInfos->pDepthStencilState->back.passOp > VK_STENCIL_OP_END_RANGE) {
3109 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3110 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.passOp, is an "
3111 "unrecognized enumerator");
3112 return false;
3113 }
3114 if (pCreateInfos->pDepthStencilState->back.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
3115 pCreateInfos->pDepthStencilState->back.depthFailOp > VK_STENCIL_OP_END_RANGE) {
3116 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3117 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.depthFailOp, is "
3118 "an unrecognized enumerator");
3119 return false;
3120 }
3121 if (pCreateInfos->pDepthStencilState->back.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3122 pCreateInfos->pDepthStencilState->back.compareOp > VK_COMPARE_OP_END_RANGE) {
3123 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3124 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->back.compareOp, is an "
3125 "unrecognized enumerator");
3126 return false;
3127 }
3128 }
3129 if (pCreateInfos->pColorBlendState != nullptr) {
3130 if (pCreateInfos->pColorBlendState->logicOpEnable == VK_TRUE &&
3131 (pCreateInfos->pColorBlendState->logicOp < VK_LOGIC_OP_BEGIN_RANGE ||
3132 pCreateInfos->pColorBlendState->logicOp > VK_LOGIC_OP_END_RANGE)) {
3133 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3134 "vkCreateGraphicsPipelines parameter, VkLogicOp pCreateInfos->pColorBlendState->logicOp, is an "
3135 "unrecognized enumerator");
3136 return false;
3137 }
3138 if (pCreateInfos->pColorBlendState->pAttachments != nullptr &&
3139 pCreateInfos->pColorBlendState->pAttachments->blendEnable == VK_TRUE) {
3140 if (pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3141 pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3142 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3143 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3144 "pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor, is an unrecognized enumerator");
3145 return false;
3146 }
3147 if (pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3148 pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3149 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3150 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3151 "pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor, is an unrecognized enumerator");
3152 return false;
3153 }
3154 if (pCreateInfos->pColorBlendState->pAttachments->colorBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
3155 pCreateInfos->pColorBlendState->pAttachments->colorBlendOp > VK_BLEND_OP_END_RANGE) {
3156 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3157 "vkCreateGraphicsPipelines parameter, VkBlendOp "
3158 "pCreateInfos->pColorBlendState->pAttachments->colorBlendOp, is an unrecognized enumerator");
3159 return false;
3160 }
3161 if (pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3162 pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3163 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3164 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3165 "pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor, is an unrecognized enumerator");
3166 return false;
3167 }
3168 if (pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
3169 pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3170 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3171 "vkCreateGraphicsPipelines parameter, VkBlendFactor "
3172 "pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor, is an unrecognized enumerator");
3173 return false;
3174 }
3175 if (pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
3176 pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp > VK_BLEND_OP_END_RANGE) {
3177 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3178 "vkCreateGraphicsPipelines parameter, VkBlendOp "
3179 "pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp, is an unrecognized enumerator");
3180 return false;
3181 }
3182 }
3183 }
3184 if (pCreateInfos->renderPass == VK_NULL_HANDLE) {
3185 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3186 "vkCreateGraphicsPipelines parameter, VkRenderPass pCreateInfos->renderPass, is null pointer");
3187 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003188
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003189 int i = 0;
3190 for (auto j = 0; j < pCreateInfos[i].stageCount; j++) {
3191 validate_string(data, "vkCreateGraphicsPipelines()", "pCreateInfos[i].pStages[j].pName",
3192 pCreateInfos[i].pStages[j].pName);
3193 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003194 }
3195
3196 return true;
3197}
3198
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003199bool PostCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count, VkPipeline *pPipelines,
3200 VkResult result) {
3201 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003202 std::string reason = "vkCreateGraphicsPipelines parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003203 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3204 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003205 return false;
3206 }
3207
3208 return true;
3209}
3210
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003211VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3212vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3213 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3214 VkPipeline *pPipelines) {
3215 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3216 VkBool32 skipCall = VK_FALSE;
3217 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003218 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003220 skipCall |= param_check_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3221 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003222
Dustin Graves1e92cd72016-02-09 14:00:18 -07003223 if (skipCall == VK_FALSE) {
3224 PreCreateGraphicsPipelines(device, pCreateInfos);
3225
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003226 result = get_dispatch_table(pc_device_table_map, device)
3227 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003228
3229 PostCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pPipelines, result);
3230 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003231
3232 return result;
3233}
3234
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003235bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003236 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3237
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003238 if (pCreateInfos != nullptr) {
3239 // TODO: Handle count!
3240 int i = 0;
3241 validate_string(data, "vkCreateComputePipelines()", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003242 }
3243
3244 return true;
3245}
3246
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003247bool PostCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count, VkPipeline *pPipelines,
3248 VkResult result) {
3249 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003250 std::string reason = "vkCreateComputePipelines parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3252 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003253 return false;
3254 }
3255
3256 return true;
3257}
3258
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003259VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3260vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3261 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
3262 VkPipeline *pPipelines) {
3263 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3264 VkBool32 skipCall = VK_FALSE;
3265 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003266 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003267
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003268 skipCall |= param_check_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
3269 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003270
Dustin Graves1e92cd72016-02-09 14:00:18 -07003271 if (skipCall == VK_FALSE) {
3272 PreCreateComputePipelines(device, pCreateInfos);
3273
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003274 result = get_dispatch_table(pc_device_table_map, device)
3275 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003276
3277 PostCreateComputePipelines(device, pipelineCache, createInfoCount, pPipelines, result);
3278 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003279
3280 return result;
3281}
3282
Dustin Graves27a912a2016-03-07 17:52:14 -07003283VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003284vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003285 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003286 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003287 assert(my_data != NULL);
3288
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003289 skipCall |= param_check_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003290
3291 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003292 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003293 }
3294}
3295
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003296bool PostCreatePipelineLayout(VkDevice device, VkPipelineLayout *pPipelineLayout, VkResult result) {
3297 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003298 std::string reason = "vkCreatePipelineLayout parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003299 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3300 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003301 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003302 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003303
3304 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003305}
3306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3308vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3309 VkPipelineLayout *pPipelineLayout) {
3310 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3311 VkBool32 skipCall = VK_FALSE;
3312 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003313 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003314
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003315 skipCall |= param_check_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003316
Dustin Graves1e92cd72016-02-09 14:00:18 -07003317 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003318 result =
3319 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003320
3321 PostCreatePipelineLayout(device, pPipelineLayout, result);
3322 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003323
3324 return result;
3325}
3326
Dustin Graves27a912a2016-03-07 17:52:14 -07003327VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003328vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003329 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003330 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003331 assert(my_data != NULL);
3332
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003333 skipCall |= param_check_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003334
3335 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003336 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003337 }
3338}
3339
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003340bool PreCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo) {
3341 if (pCreateInfo != nullptr) {
3342 if (pCreateInfo->magFilter < VK_FILTER_BEGIN_RANGE || pCreateInfo->magFilter > VK_FILTER_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003343 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003344 "vkCreateSampler parameter, VkFilter pCreateInfo->magFilter, is an unrecognized enumerator");
3345 return false;
3346 }
3347 if (pCreateInfo->minFilter < VK_FILTER_BEGIN_RANGE || pCreateInfo->minFilter > VK_FILTER_END_RANGE) {
3348 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3349 "vkCreateSampler parameter, VkFilter pCreateInfo->minFilter, is an unrecognized enumerator");
3350 return false;
3351 }
3352 if (pCreateInfo->mipmapMode < VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE ||
3353 pCreateInfo->mipmapMode > VK_SAMPLER_MIPMAP_MODE_END_RANGE) {
3354 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3355 "vkCreateSampler parameter, VkSamplerMipmapMode pCreateInfo->mipmapMode, is an unrecognized enumerator");
3356 return false;
3357 }
3358 if (pCreateInfo->addressModeU < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3359 pCreateInfo->addressModeU > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3360 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3361 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeU, is an unrecognized enumerator");
3362 return false;
3363 }
3364 if (pCreateInfo->addressModeV < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3365 pCreateInfo->addressModeV > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3366 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3367 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeV, is an unrecognized enumerator");
3368 return false;
3369 }
3370 if (pCreateInfo->addressModeW < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3371 pCreateInfo->addressModeW > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3372 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3373 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeW, is an unrecognized enumerator");
3374 return false;
3375 }
3376 if (pCreateInfo->anisotropyEnable > VK_TRUE) {
3377 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3378 "vkCreateSampler parameter, VkBool32 pCreateInfo->anisotropyEnable, is an unrecognized boolean");
3379 return false;
3380 }
3381 if (pCreateInfo->compareEnable > VK_TRUE) {
3382 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3383 "vkCreateSampler parameter, VkBool32 pCreateInfo->compareEnable, is an unrecognized boolean");
3384 return false;
3385 }
3386 if (pCreateInfo->compareEnable) {
3387 if (pCreateInfo->compareOp < VK_COMPARE_OP_BEGIN_RANGE || pCreateInfo->compareOp > VK_COMPARE_OP_END_RANGE) {
3388 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3389 "vkCreateSampler parameter, VkCompareOp pCreateInfo->compareOp, is an unrecognized enumerator");
3390 return false;
3391 }
3392 }
3393 if (pCreateInfo->borderColor < VK_BORDER_COLOR_BEGIN_RANGE || pCreateInfo->borderColor > VK_BORDER_COLOR_END_RANGE) {
3394 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3395 "vkCreateSampler parameter, VkBorderColor pCreateInfo->borderColor, is an unrecognized enumerator");
3396 return false;
3397 }
3398 if (pCreateInfo->unnormalizedCoordinates > VK_TRUE) {
3399 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3400 "vkCreateSampler parameter, VkBool32 pCreateInfo->unnormalizedCoordinates, is an unrecognized boolean");
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003401 return false;
3402 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003403 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003404
3405 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003406}
3407
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003408bool PostCreateSampler(VkDevice device, VkSampler *pSampler, VkResult result) {
3409 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003410 std::string reason = "vkCreateSampler parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003411 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3412 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003413 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003414 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003415
3416 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003417}
3418
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003419VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3420 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
3421 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3422 VkBool32 skipCall = VK_FALSE;
3423 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003424 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003425
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003426 skipCall |= param_check_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003427
Dustin Graves1e92cd72016-02-09 14:00:18 -07003428 if (skipCall == VK_FALSE) {
3429 PreCreateSampler(device, pCreateInfo);
3430
3431 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3432
3433 PostCreateSampler(device, pSampler, result);
3434 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003435
3436 return result;
3437}
3438
Dustin Graves27a912a2016-03-07 17:52:14 -07003439VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003440vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003441 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003442 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003443 assert(my_data != NULL);
3444
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003445 skipCall |= param_check_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003446
3447 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003448 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003449 }
3450}
3451
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003452bool PreCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo) {
3453 if (pCreateInfo != nullptr) {
3454 if (pCreateInfo->pBindings != nullptr) {
3455 if (pCreateInfo->pBindings->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
3456 pCreateInfo->pBindings->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE) {
3457 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3458 "vkCreateDescriptorSetLayout parameter, VkDescriptorType pCreateInfo->pBindings->descriptorType, is an "
3459 "unrecognized enumerator");
3460 return false;
3461 }
3462 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003463 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003464
3465 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003466}
3467
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003468bool PostCreateDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout *pSetLayout, VkResult result) {
3469 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003470 std::string reason = "vkCreateDescriptorSetLayout parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003471 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3472 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003473 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003474 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003475
3476 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003477}
3478
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003479VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3480vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3481 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
3482 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3483 VkBool32 skipCall = VK_FALSE;
3484 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003485 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003486
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003487 skipCall |= param_check_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003488
Dustin Graves1e92cd72016-02-09 14:00:18 -07003489 if (skipCall == VK_FALSE) {
3490 PreCreateDescriptorSetLayout(device, pCreateInfo);
3491
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003492 result =
3493 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003494
3495 PostCreateDescriptorSetLayout(device, pSetLayout, result);
3496 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003497
3498 return result;
3499}
3500
Dustin Graves27a912a2016-03-07 17:52:14 -07003501VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003502vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003503 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003504 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003505 assert(my_data != NULL);
3506
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003507 skipCall |= param_check_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003508
3509 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003510 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003511 }
3512}
3513
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003514bool PreCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo) {
3515 if (pCreateInfo != nullptr) {
3516 if (pCreateInfo->pPoolSizes != nullptr) {
3517 if (pCreateInfo->pPoolSizes->type < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
3518 pCreateInfo->pPoolSizes->type > VK_DESCRIPTOR_TYPE_END_RANGE) {
3519 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3520 "vkCreateDescriptorPool parameter, VkDescriptorType pCreateInfo->pTypeCount->type, is an unrecognized "
3521 "enumerator");
3522 return false;
3523 }
3524 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003525 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003526
3527 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003528}
3529
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003530bool PostCreateDescriptorPool(VkDevice device, uint32_t maxSets, VkDescriptorPool *pDescriptorPool, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003531
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003532 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
Jeremy Hayes99a96322015-06-26 12:48:09 -06003533
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003534 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003535 std::string reason = "vkCreateDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003536 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3537 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003538 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003539 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003540
3541 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003542}
3543
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003544VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3545vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3546 VkDescriptorPool *pDescriptorPool) {
3547 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3548 VkBool32 skipCall = VK_FALSE;
3549 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003550 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003551
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003552 skipCall |= param_check_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003553
Dustin Graves1e92cd72016-02-09 14:00:18 -07003554 if (skipCall == VK_FALSE) {
3555 PreCreateDescriptorPool(device, pCreateInfo);
3556
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003557 result =
3558 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003559
3560 PostCreateDescriptorPool(device, pCreateInfo->maxSets, pDescriptorPool, result);
3561 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003562
3563 return result;
3564}
3565
Dustin Graves27a912a2016-03-07 17:52:14 -07003566VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003567vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003568 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003569 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003570 assert(my_data != NULL);
3571
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003572 skipCall |= param_check_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003573
3574 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003575 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003576 }
3577}
3578
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003579bool PostResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003580
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003581 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003582 std::string reason = "vkResetDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003583 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3584 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003585 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003586 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003587
3588 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003589}
3590
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003591VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3592vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003593 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003594
3595 PostResetDescriptorPool(device, descriptorPool, result);
3596
3597 return result;
3598}
3599
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003600bool PostAllocateDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, VkDescriptorSet *pDescriptorSets,
3601 VkResult result) {
3602 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003603 std::string reason = "vkAllocateDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003604 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3605 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003606 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003607 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003608
3609 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003610}
3611
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003612VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3613vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
3614 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3615 VkBool32 skipCall = VK_FALSE;
3616 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003617 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003618
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003619 skipCall |= param_check_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003620
Dustin Graves1e92cd72016-02-09 14:00:18 -07003621 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003622 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3623
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003624 PostAllocateDescriptorSets(device, pAllocateInfo->descriptorPool, pAllocateInfo->descriptorSetCount, pDescriptorSets,
3625 result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003626 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003627
3628 return result;
3629}
3630
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003631bool PostFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003632
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003633 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003634 std::string reason = "vkFreeDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003635 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3636 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003637 return false;
3638 }
3639
3640 return true;
3641}
3642
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003643VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3644 uint32_t descriptorSetCount,
3645 const VkDescriptorSet *pDescriptorSets) {
3646 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3647 VkBool32 skipCall = VK_FALSE;
3648 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003649 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003650
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003651 skipCall |= param_check_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003652
Dustin Graves1e92cd72016-02-09 14:00:18 -07003653 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003654 result = get_dispatch_table(pc_device_table_map, device)
3655 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003656
3657 PostFreeDescriptorSets(device, descriptorPool, descriptorSetCount, result);
3658 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003659
3660 return result;
3661}
3662
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003663bool PreUpdateDescriptorSets(VkDevice device, const VkWriteDescriptorSet *pDescriptorWrites,
3664 const VkCopyDescriptorSet *pDescriptorCopies) {
3665 if (pDescriptorWrites != nullptr) {
3666 if (pDescriptorWrites->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
3667 pDescriptorWrites->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE) {
3668 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3669 "vkUpdateDescriptorSets parameter, VkDescriptorType pDescriptorWrites->descriptorType, is an unrecognized "
3670 "enumerator");
3671 return false;
3672 }
3673 /* TODO: Validate other parts of pImageInfo, pBufferInfo, pTexelBufferView? */
3674 /* TODO: This test should probably only be done if descriptorType is correct type of descriptor */
3675 if (pDescriptorWrites->pImageInfo != nullptr) {
3676 if (((pDescriptorWrites->pImageInfo->imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3677 (pDescriptorWrites->pImageInfo->imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3678 (pDescriptorWrites->pImageInfo->imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3679 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3680 "vkUpdateDescriptorSets parameter, VkImageLayout pDescriptorWrites->pDescriptors->imageLayout, is an "
3681 "unrecognized enumerator");
3682 return false;
3683 }
3684 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003685 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003686
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003687 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003688}
3689
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003690VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3691vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3692 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
3693 VkBool32 skipCall = VK_FALSE;
3694 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003695 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003696
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003697 skipCall |= param_check_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
3698 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003699
3700 if (skipCall == VK_FALSE) {
3701 PreUpdateDescriptorSets(device, pDescriptorWrites, pDescriptorCopies);
3702
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003703 get_dispatch_table(pc_device_table_map, device)
3704 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003705 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003706}
3707
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003708bool PostCreateFramebuffer(VkDevice device, VkFramebuffer *pFramebuffer, VkResult result) {
3709 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003710 std::string reason = "vkCreateFramebuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003711 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3712 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003713 return false;
3714 }
3715
3716 return true;
3717}
3718
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003719VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3720 const VkAllocationCallbacks *pAllocator,
3721 VkFramebuffer *pFramebuffer) {
3722 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3723 VkBool32 skipCall = VK_FALSE;
3724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003725 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003726
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003727 skipCall |= param_check_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003728
Dustin Graves1e92cd72016-02-09 14:00:18 -07003729 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003730 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3731
3732 PostCreateFramebuffer(device, pFramebuffer, result);
3733 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003734
3735 return result;
3736}
3737
Dustin Graves27a912a2016-03-07 17:52:14 -07003738VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003739vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003740 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003741 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003742 assert(my_data != NULL);
3743
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003744 skipCall |= param_check_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003745
3746 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003747 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003748 }
3749}
3750
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003751bool PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo) {
3752 if (pCreateInfo != nullptr) {
3753 if (pCreateInfo->pAttachments != nullptr) {
3754 if (pCreateInfo->pAttachments->format < VK_FORMAT_BEGIN_RANGE ||
3755 pCreateInfo->pAttachments->format > VK_FORMAT_END_RANGE) {
3756 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3757 "vkCreateRenderPass parameter, VkFormat pCreateInfo->pAttachments->format, is an unrecognized enumerator");
3758 return false;
3759 }
3760 if (pCreateInfo->pAttachments->loadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
3761 pCreateInfo->pAttachments->loadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE) {
3762 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3763 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->loadOp, is an unrecognized "
3764 "enumerator");
3765 return false;
3766 }
3767 if (pCreateInfo->pAttachments->storeOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
3768 pCreateInfo->pAttachments->storeOp > VK_ATTACHMENT_STORE_OP_END_RANGE) {
3769 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3770 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->storeOp, is an unrecognized "
3771 "enumerator");
3772 return false;
3773 }
3774 if (pCreateInfo->pAttachments->stencilLoadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
3775 pCreateInfo->pAttachments->stencilLoadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE) {
3776 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3777 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->stencilLoadOp, is an "
3778 "unrecognized enumerator");
3779 return false;
3780 }
3781 if (pCreateInfo->pAttachments->stencilStoreOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
3782 pCreateInfo->pAttachments->stencilStoreOp > VK_ATTACHMENT_STORE_OP_END_RANGE) {
3783 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3784 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->stencilStoreOp, is an "
3785 "unrecognized enumerator");
3786 return false;
3787 }
3788 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3789 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3790 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3791 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3792 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->initialLayout, is an unrecognized "
3793 "enumerator");
3794 return false;
3795 }
3796 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3797 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3798 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3799 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3800 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->finalLayout, is an unrecognized "
3801 "enumerator");
3802 return false;
3803 }
3804 }
3805 if (pCreateInfo->pSubpasses != nullptr) {
3806 if (pCreateInfo->pSubpasses->pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
3807 pCreateInfo->pSubpasses->pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
3808 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3809 "vkCreateRenderPass parameter, VkPipelineBindPoint pCreateInfo->pSubpasses->pipelineBindPoint, is an "
3810 "unrecognized enumerator");
3811 return false;
3812 }
3813 if (pCreateInfo->pSubpasses->pInputAttachments != nullptr) {
3814 if (((pCreateInfo->pSubpasses->pInputAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3815 (pCreateInfo->pSubpasses->pInputAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3816 (pCreateInfo->pSubpasses->pInputAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3817 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3818 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pInputAttachments->layout, is an "
3819 "unrecognized enumerator");
3820 return false;
3821 }
3822 }
3823 if (pCreateInfo->pSubpasses->pColorAttachments != nullptr) {
3824 if (((pCreateInfo->pSubpasses->pColorAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3825 (pCreateInfo->pSubpasses->pColorAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3826 (pCreateInfo->pSubpasses->pColorAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3827 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3828 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pColorAttachments->layout, is an "
3829 "unrecognized enumerator");
3830 return false;
3831 }
3832 }
3833 if (pCreateInfo->pSubpasses->pResolveAttachments != nullptr) {
3834 if (((pCreateInfo->pSubpasses->pResolveAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3835 (pCreateInfo->pSubpasses->pResolveAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3836 (pCreateInfo->pSubpasses->pResolveAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3837 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3838 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pResolveAttachments->layout, is "
3839 "an unrecognized enumerator");
3840 return false;
3841 }
3842 }
3843 if (pCreateInfo->pSubpasses->pDepthStencilAttachment &&
3844 ((pCreateInfo->pSubpasses->pDepthStencilAttachment->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
3845 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
3846 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
3847 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3848 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pDepthStencilAttachment->layout, is "
3849 "an unrecognized enumerator");
3850 return false;
3851 }
3852 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003853 }
3854
3855 return true;
3856}
3857
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003858bool PostCreateRenderPass(VkDevice device, VkRenderPass *pRenderPass, VkResult result) {
3859 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003860 std::string reason = "vkCreateRenderPass parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003861 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3862 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003863 return false;
3864 }
3865
3866 return true;
3867}
3868
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003869VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3870 const VkAllocationCallbacks *pAllocator,
3871 VkRenderPass *pRenderPass) {
3872 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3873 VkBool32 skipCall = VK_FALSE;
3874 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003875 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003876
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003877 skipCall |= param_check_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003878
Dustin Graves1e92cd72016-02-09 14:00:18 -07003879 if (skipCall == VK_FALSE) {
3880 PreCreateRenderPass(device, pCreateInfo);
3881
3882 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3883
3884 PostCreateRenderPass(device, pRenderPass, result);
3885 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003886
3887 return result;
3888}
3889
Dustin Graves27a912a2016-03-07 17:52:14 -07003890VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003891vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003892 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003893 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003894 assert(my_data != NULL);
3895
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003896 skipCall |= param_check_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003897
3898 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003899 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003900 }
3901}
3902
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003903VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3904vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3905 VkBool32 skipCall = VK_FALSE;
3906 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003907 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003908
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003909 skipCall |= param_check_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003910
3911 if (skipCall == VK_FALSE) {
3912 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003913 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003914}
3915
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003916bool PostCreateCommandPool(VkDevice device, VkCommandPool *pCommandPool, VkResult result) {
3917 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003918 std::string reason = "vkCreateCommandPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003919 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3920 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003921 return false;
3922 }
3923
3924 return true;
3925}
3926
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003927VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3928 const VkAllocationCallbacks *pAllocator,
3929 VkCommandPool *pCommandPool) {
3930 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3931 VkBool32 skipCall = VK_FALSE;
3932 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003933 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003934
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003935 skipCall |= param_check_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003936
Dustin Graves1e92cd72016-02-09 14:00:18 -07003937 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003938 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3939
3940 PostCreateCommandPool(device, pCommandPool, result);
3941 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003942
3943 return result;
3944}
3945
Dustin Graves27a912a2016-03-07 17:52:14 -07003946VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003947vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves27a912a2016-03-07 17:52:14 -07003948 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003949 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003950 assert(my_data != NULL);
3951
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003952 skipCall |= param_check_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003953
3954 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003955 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003956 }
3957}
3958
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003959bool PostResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003960
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003961 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003962 std::string reason = "vkResetCommandPool parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003963 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3964 reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003965 return false;
3966 }
3967
3968 return true;
3969}
3970
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003971VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3972vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003973 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003974
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003975 PostResetCommandPool(device, commandPool, flags, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003976
3977 return result;
3978}
3979
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003980bool PreCreateCommandBuffer(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo) {
3981 if (pCreateInfo != nullptr) {
3982 if (pCreateInfo->level < VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE || pCreateInfo->level > VK_COMMAND_BUFFER_LEVEL_END_RANGE) {
3983 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3984 "vkAllocateCommandBuffers parameter, VkCommandBufferLevel pCreateInfo->level, is an unrecognized enumerator");
3985 return false;
3986 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003987 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003988
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003989 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003990}
3991
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003992bool PostCreateCommandBuffer(VkDevice device, VkCommandBuffer *pCommandBuffer, VkResult result) {
3993 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003994 std::string reason = "vkAllocateCommandBuffers parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003995 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s",
3996 reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003997 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003998 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003999
4000 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004001}
4002
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004003VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4004vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
4005 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4006 VkBool32 skipCall = VK_FALSE;
4007 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004008 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004009
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004010 skipCall |= param_check_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004011
Dustin Graves1e92cd72016-02-09 14:00:18 -07004012 if (skipCall == VK_FALSE) {
4013 PreCreateCommandBuffer(device, pAllocateInfo);
4014
4015 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
4016
4017 PostCreateCommandBuffer(device, pCommandBuffers, result);
4018 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004019
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004020 return result;
4021}
4022
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004023VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
4024 uint32_t commandBufferCount,
4025 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004026 VkBool32 skipCall = VK_FALSE;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004027 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004028 assert(my_data != NULL);
4029
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004030 skipCall |= param_check_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004031
4032 if (skipCall == VK_FALSE) {
4033 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004034 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004035 }
4036}
4037
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004038bool PostBeginCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004039
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004040 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004041 std::string reason = "vkBeginCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004042 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4043 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004044 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004045 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004046
4047 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004048}
4049
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004050VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4051vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
4052 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4053 VkBool32 skipCall = VK_FALSE;
4054 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004055 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004056
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004057 skipCall |= param_check_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004058
Dustin Graves1e92cd72016-02-09 14:00:18 -07004059 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004060 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
4061
4062 PostBeginCommandBuffer(commandBuffer, result);
4063 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004064
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004065 return result;
4066}
4067
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004068bool PostEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004069
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004070 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004071 std::string reason = "vkEndCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004072 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4073 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004074 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004075 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004076
4077 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004078}
4079
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004080VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004081 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004082
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004083 PostEndCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004084
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004085 return result;
4086}
4087
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004088bool PostResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004089
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004090 if (result < VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004091 std::string reason = "vkResetCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004092 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4093 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004094 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004095 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004096
4097 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004098}
4099
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004100VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4101vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004102 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004103
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004104 PostResetCommandBuffer(commandBuffer, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004106 return result;
4107}
4108
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004109bool PostCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004110
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004111 if (pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE || pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004112 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004113 "vkCmdBindPipeline parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004114 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004115 }
4116
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004117 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004118}
4119
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004120VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4121vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004122 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004123
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004124 PostCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004125}
4126
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004127VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4128vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
4129 VkBool32 skipCall = VK_FALSE;
4130 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004131 assert(my_data != NULL);
4132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004133 skipCall |= param_check_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004134
4135 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004136 get_dispatch_table(pc_device_table_map, commandBuffer)
4137 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004138 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004139}
4140
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004141VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4142vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
4143 VkBool32 skipCall = VK_FALSE;
4144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004145 assert(my_data != NULL);
4146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004147 skipCall |= param_check_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004148
4149 if (skipCall == VK_FALSE) {
4150 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4151 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004152}
4153
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004154VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004155 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004156}
4157
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004158VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4159vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
4160 get_dispatch_table(pc_device_table_map, commandBuffer)
4161 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004162}
4163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004164VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
4165 VkBool32 skipCall = VK_FALSE;
4166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004167 assert(my_data != NULL);
4168
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004169 skipCall |= param_check_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004170
4171 if (skipCall == VK_FALSE) {
4172 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4173 }
Cody Northrop12365112015-08-17 11:10:49 -06004174}
4175
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004176VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4177vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004178 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004179}
4180
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004181VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4182vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004183 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004184}
4185
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004186VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4187vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004188 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004189}
4190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004191VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4192vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004193 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004194}
4195
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004196bool PostCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
4197 uint32_t firstSet, uint32_t setCount, uint32_t dynamicOffsetCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004198
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004199 if (pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE || pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004200 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004201 "vkCmdBindDescriptorSets parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004202 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004203 }
4204
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004205 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004206}
4207
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004208VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4209vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
4210 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
4211 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
4212 VkBool32 skipCall = VK_FALSE;
4213 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004214 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004215
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004216 skipCall |= param_check_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4217 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004218
Dustin Graves1e92cd72016-02-09 14:00:18 -07004219 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004220 get_dispatch_table(pc_device_table_map, commandBuffer)
4221 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4222 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004223
4224 PostCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, dynamicOffsetCount);
4225 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004226}
4227
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004228bool PostCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004229
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004230 if (indexType < VK_INDEX_TYPE_BEGIN_RANGE || indexType > VK_INDEX_TYPE_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004231 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004232 "vkCmdBindIndexBuffer parameter, VkIndexType indexType, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004233 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004234 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004235
4236 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004237}
4238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004239VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4240vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004241 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004242
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004243 PostCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004244}
4245
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004246VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4247 uint32_t bindingCount, const VkBuffer *pBuffers,
4248 const VkDeviceSize *pOffsets) {
4249 VkBool32 skipCall = VK_FALSE;
4250 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004251 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004252
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004253 skipCall |= param_check_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004254
Dustin Graves1e92cd72016-02-09 14:00:18 -07004255 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004256 get_dispatch_table(pc_device_table_map, commandBuffer)
4257 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004258 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004259}
4260
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4262 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004263 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004264 // 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 -07004265 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004266 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004267 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004268 return false;
4269 }
4270
4271 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004272 // 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 -07004273 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07004274 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004275 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004276 return false;
4277 }
4278
4279 return true;
4280}
4281
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4283 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004284 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004285
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004286 get_dispatch_table(pc_device_table_map, commandBuffer)
4287 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004288}
4289
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004290VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
4291 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
4292 uint32_t firstInstance) {
4293 get_dispatch_table(pc_device_table_map, commandBuffer)
4294 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004295}
4296
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004297VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4298vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004299 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004300}
4301
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004302VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4303vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004304 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004305}
4306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004307VK_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 -07004308 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004309}
4310
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004311VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4312vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004313 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004314}
4315
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004316VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4317 uint32_t regionCount, const VkBufferCopy *pRegions) {
4318 VkBool32 skipCall = VK_FALSE;
4319 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004320 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004321
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004322 skipCall |= param_check_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004323
Dustin Graves1e92cd72016-02-09 14:00:18 -07004324 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004325 get_dispatch_table(pc_device_table_map, commandBuffer)
4326 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004327 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004328}
4329
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004330bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4331 if (pRegions != nullptr) {
4332 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4333 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4334 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4335 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4336 return false;
4337 }
4338 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4339 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4340 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4341 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4342 return false;
4343 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004344 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004345
4346 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004347}
4348
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004349bool PostCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4350 VkImageLayout dstImageLayout, uint32_t regionCount) {
4351 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4352 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004353 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004354 "vkCmdCopyImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004355 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004356 }
4357
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004358 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4359 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004360 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004361 "vkCmdCopyImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004362 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004363 }
4364
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004365 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004366}
4367
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004368VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4369vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4370 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
4371 VkBool32 skipCall = VK_FALSE;
4372 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004373 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004374
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004375 skipCall |=
4376 param_check_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004377
Dustin Graves1e92cd72016-02-09 14:00:18 -07004378 if (skipCall == VK_FALSE) {
4379 PreCmdCopyImage(commandBuffer, pRegions);
4380
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004381 get_dispatch_table(pc_device_table_map, commandBuffer)
4382 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004383
4384 PostCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
4385 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004386}
4387
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004388bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4389 if (pRegions != nullptr) {
4390 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4391 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4392 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4393 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4394 return false;
4395 }
4396 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4397 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4398 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4399 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4400 return false;
4401 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004402 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004403
4404 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004405}
4406
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004407bool PostCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4408 VkImageLayout dstImageLayout, uint32_t regionCount, VkFilter filter) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004409
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004410 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4411 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004412 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004413 "vkCmdBlitImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004414 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004415 }
4416
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004417 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4418 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004419 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004420 "vkCmdBlitImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004421 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004422 }
4423
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004424 if (filter < VK_FILTER_BEGIN_RANGE || filter > VK_FILTER_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004425 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004426 "vkCmdBlitImage parameter, VkFilter filter, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004427 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004428 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004429
4430 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004431}
4432
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004433VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4434vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4435 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
4436 VkBool32 skipCall = VK_FALSE;
4437 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004438 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004439
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004440 skipCall |= param_check_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4441 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004442
Dustin Graves1e92cd72016-02-09 14:00:18 -07004443 if (skipCall == VK_FALSE) {
4444 PreCmdBlitImage(commandBuffer, pRegions);
4445
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004446 get_dispatch_table(pc_device_table_map, commandBuffer)
4447 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004448
4449 PostCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, filter);
4450 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004451}
4452
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004453bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4454 if (pRegions != nullptr) {
4455 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4456 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4457 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4458 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4459 "enumerator");
4460 return false;
4461 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004462 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004463
4464 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004465}
4466
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004467bool PostCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout,
4468 uint32_t regionCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004469
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004470 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4471 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004472 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004473 "vkCmdCopyBufferToImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004474 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004475 }
4476
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004477 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004478}
4479
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004480VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
4481 VkImage dstImage, VkImageLayout dstImageLayout,
4482 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4483 VkBool32 skipCall = VK_FALSE;
4484 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004485 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004486
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004487 skipCall |=
4488 param_check_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004489
Dustin Graves1e92cd72016-02-09 14:00:18 -07004490 if (skipCall == VK_FALSE) {
4491 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4492
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004493 get_dispatch_table(pc_device_table_map, commandBuffer)
4494 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004495
4496 PostCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount);
4497 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004498}
4499
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004500bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4501 if (pRegions != nullptr) {
4502 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4503 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4504 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4505 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4506 "enumerator");
4507 return false;
4508 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004509 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004510
4511 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004512}
4513
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004514bool PostCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4515 uint32_t regionCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004516
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004517 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4518 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004519 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004520 "vkCmdCopyImageToBuffer parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004521 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004522 }
4523
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004524 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004525}
4526
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004527VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
4528 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
4529 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4530 VkBool32 skipCall = VK_FALSE;
4531 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004532 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004533
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004534 skipCall |=
4535 param_check_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004536
Dustin Graves1e92cd72016-02-09 14:00:18 -07004537 if (skipCall == VK_FALSE) {
4538 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4539
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004540 get_dispatch_table(pc_device_table_map, commandBuffer)
4541 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004542
4543 PostCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount);
4544 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004545}
4546
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004547VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
4548 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
4549 VkBool32 skipCall = VK_FALSE;
4550 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004551 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004552
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004553 skipCall |= param_check_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004554
Dustin Graves1e92cd72016-02-09 14:00:18 -07004555 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004556 get_dispatch_table(pc_device_table_map, commandBuffer)
4557 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004558 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004559}
4560
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004561VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4562vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004563 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004564}
4565
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004566bool PostCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, uint32_t rangeCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004567
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004568 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4569 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004570 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004571 "vkCmdClearColorImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004572 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004573 }
4574
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004575 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004576}
4577
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004578VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4579 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4580 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
4581 VkBool32 skipCall = VK_FALSE;
4582 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004583 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004584
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004585 skipCall |= param_check_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004586
Dustin Graves1e92cd72016-02-09 14:00:18 -07004587 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004588 get_dispatch_table(pc_device_table_map, commandBuffer)
4589 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004590
4591 PostCmdClearColorImage(commandBuffer, image, imageLayout, rangeCount);
4592 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004593}
4594
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004595bool PostCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4596 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004597
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004598 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4599 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004600 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004601 "vkCmdClearDepthStencilImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004602 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004603 }
4604
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004605 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004606}
4607
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004608VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4609vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4610 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4611 const VkImageSubresourceRange *pRanges) {
4612 VkBool32 skipCall = VK_FALSE;
4613 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004614 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004615
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004616 skipCall |=
4617 param_check_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004618
Dustin Graves1e92cd72016-02-09 14:00:18 -07004619 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004620 get_dispatch_table(pc_device_table_map, commandBuffer)
4621 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004622
4623 PostCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount);
4624 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004625}
4626
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004627VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4628 const VkClearAttachment *pAttachments, uint32_t rectCount,
4629 const VkClearRect *pRects) {
4630 VkBool32 skipCall = VK_FALSE;
4631 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004632 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004633
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004634 skipCall |= param_check_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004635
4636 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004637 get_dispatch_table(pc_device_table_map, commandBuffer)
4638 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004639 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004640}
4641
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004642bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4643 if (pRegions != nullptr) {
4644 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4645 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4646 log_msg(
4647 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4648 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4649 return false;
4650 }
4651 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4652 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4653 log_msg(
4654 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4655 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4656 return false;
4657 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004658 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004659
4660 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004661}
4662
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004663bool PostCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4664 VkImageLayout dstImageLayout, uint32_t regionCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004665
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004666 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4667 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004668 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004669 "vkCmdResolveImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004670 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004671 }
4672
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004673 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) || (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4674 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004675 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004676 "vkCmdResolveImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004677 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004678 }
4679
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004680 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004681}
4682
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004683VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4684vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4685 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
4686 VkBool32 skipCall = VK_FALSE;
4687 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004688 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004689
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004690 skipCall |= param_check_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4691 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004692
Dustin Graves1e92cd72016-02-09 14:00:18 -07004693 if (skipCall == VK_FALSE) {
4694 PreCmdResolveImage(commandBuffer, pRegions);
4695
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004696 get_dispatch_table(pc_device_table_map, commandBuffer)
4697 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004698
4699 PostCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
4700 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004701}
4702
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004703VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4704vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004705 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004706}
4707
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004708VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4709vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004710 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004711}
4712
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004713VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4714vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4715 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4716 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4717 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4718 VkBool32 skipCall = VK_FALSE;
4719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004720 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004721
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004722 skipCall |= param_check_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4723 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4724 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004725
Dustin Graves1e92cd72016-02-09 14:00:18 -07004726 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004727 get_dispatch_table(pc_device_table_map, commandBuffer)
4728 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4729 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004730 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004731}
4732
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004733VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4734vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4735 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4736 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4737 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4738 VkBool32 skipCall = VK_FALSE;
4739 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004740 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004741
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004742 skipCall |= param_check_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4743 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4744 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004745
Dustin Graves1e92cd72016-02-09 14:00:18 -07004746 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004747 get_dispatch_table(pc_device_table_map, commandBuffer)
4748 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4749 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004750 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004751}
4752
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004753VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4754vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004755 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004756}
4757
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004758VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004759 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004760}
4761
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004762VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4763vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004764 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004765}
4766
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004767bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4768 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004769
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004770 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004771
4772 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004773}
4774
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004775VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4776vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004777 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004778
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004779 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004780}
4781
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004782VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4783vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4784 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
4785 get_dispatch_table(pc_device_table_map, commandBuffer)
4786 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004787}
4788
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004789VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4790 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4791 const void *pValues) {
4792 VkBool32 skipCall = VK_FALSE;
4793 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004794 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004795
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004796 skipCall |= param_check_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004797
Dustin Graves1e92cd72016-02-09 14:00:18 -07004798 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004799 get_dispatch_table(pc_device_table_map, commandBuffer)
4800 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004801 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004802}
4803
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004804bool PostCmdBeginRenderPass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004805
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004806 if (contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE || contents > VK_SUBPASS_CONTENTS_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004807 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004808 "vkCmdBeginRenderPass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004809 return false;
4810 }
4811
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004812 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004813}
4814
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004815VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4816vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
4817 VkBool32 skipCall = VK_FALSE;
4818 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004819 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004820
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004821 skipCall |= param_check_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004822
Dustin Graves1e92cd72016-02-09 14:00:18 -07004823 if (skipCall == VK_FALSE) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004824 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
4825
4826 PostCmdBeginRenderPass(commandBuffer, contents);
4827 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004828}
4829
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004830bool PostCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004831
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004832 if (contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE || contents > VK_SUBPASS_CONTENTS_END_RANGE) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004833 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004834 "vkCmdNextSubpass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004835 return false;
Chia-I Wu08accc62015-07-07 11:50:03 +08004836 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004837
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004838 return true;
Chia-I Wu08accc62015-07-07 11:50:03 +08004839}
4840
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004841VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004842 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
Chia-I Wu08accc62015-07-07 11:50:03 +08004843
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004844 PostCmdNextSubpass(commandBuffer, contents);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004845}
4846
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004847VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004848 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004849}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004850
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004851VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4852vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
4853 VkBool32 skipCall = VK_FALSE;
4854 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004855 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004856
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004857 skipCall |= param_check_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004858
Dustin Graves1e92cd72016-02-09 14:00:18 -07004859 if (skipCall == VK_FALSE) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004860 get_dispatch_table(pc_device_table_map, commandBuffer)
4861 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004862 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004863}
4864
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004865VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004866 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4867
4868 if (validate_string(data, "vkGetDeviceProcAddr()", "funcName", funcName) == VK_TRUE) {
4869 return NULL;
4870 }
4871
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004872 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004873 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004874 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004875 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004876 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004877 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004878 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004879 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004880 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004881 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004882 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004883 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004884 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004885 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07004886 if (!strcmp(funcName, "vkFreeMemory"))
4887 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004888 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004889 return (PFN_vkVoidFunction)vkMapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004890 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004891 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004892 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004893 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004894 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004895 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07004896 if (!strcmp(funcName, "vkDestroyFence"))
4897 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004898 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004899 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004900 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004901 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004902 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004903 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004904 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004905 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07004906 if (!strcmp(funcName, "vkDestroySemaphore"))
4907 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004908 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004909 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07004910 if (!strcmp(funcName, "vkDestroyEvent"))
4911 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004912 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004913 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004914 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004915 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004916 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004917 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004918 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004919 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004920 if (!strcmp(funcName, "vkDestroyQueryPool"))
4921 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004922 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004923 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004924 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004925 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004926 if (!strcmp(funcName, "vkDestroyBuffer"))
4927 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004928 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004929 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004930 if (!strcmp(funcName, "vkDestroyBufferView"))
4931 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004932 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004933 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07004934 if (!strcmp(funcName, "vkDestroyImage"))
4935 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004936 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004937 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004938 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004939 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004940 if (!strcmp(funcName, "vkDestroyImageView"))
4941 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05004942 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004943 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07004944 if (!strcmp(funcName, "vkDestroyShaderModule"))
4945 return (PFN_vkVoidFunction)vkDestroyShaderModule;
4946 if (!strcmp(funcName, "vkCreatePipelineCache"))
4947 return (PFN_vkVoidFunction)vkCreatePipelineCache;
4948 if (!strcmp(funcName, "vkDestroyPipelineCache"))
4949 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
4950 if (!strcmp(funcName, "vkGetPipelineCacheData"))
4951 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
4952 if (!strcmp(funcName, "vkMergePipelineCaches"))
4953 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004954 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004955 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004956 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004957 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07004958 if (!strcmp(funcName, "vkDestroyPipeline"))
4959 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004960 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004961 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004962 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
4963 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004964 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004965 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07004966 if (!strcmp(funcName, "vkDestroySampler"))
4967 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004968 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004969 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004970 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
4971 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004972 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004973 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004974 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
4975 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004976 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004977 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004978 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004979 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004980 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004981 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004982 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004983 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004984 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004985 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004986 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004987 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004988 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004989 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004990 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004991 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004992 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004993 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004994 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004995 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004996 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004997 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004998 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004999 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07005000 if (!strcmp(funcName, "vkFreeCommandBuffers"))
5001 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005002 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005003 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005004 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005005 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005006 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005007 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005008 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005009 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005010 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005011 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005012 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005013 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005014 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005015 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005016 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005017 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005018 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005019 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005020 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005021 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005022 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005023 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005024 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005025 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005026 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005027 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005028 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005029 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005030 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005031 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005032 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005033 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005034 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005035 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005036 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005037 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005038 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005039 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005040 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005041 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005042 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005043 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005044 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005045 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005046 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005047 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005048 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005049 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005050 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005051 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005052 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005053 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005054 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005055 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005056 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005057 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005058 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005059 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005060 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005061 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005062 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005063 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005064 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005065 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07005066 if (!strcmp(funcName, "vkDestroyFramebuffer"))
5067 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005068 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005069 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07005070 if (!strcmp(funcName, "vkDestroyRenderPass"))
5071 return (PFN_vkVoidFunction)vkDestroyRenderPass;
5072 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
5073 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
5074 if (!strcmp(funcName, "vkCreateCommandPool"))
5075 return (PFN_vkVoidFunction)vkCreateCommandPool;
5076 if (!strcmp(funcName, "vkDestroyCommandPool"))
5077 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005078 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005079 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08005080 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005081 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06005082
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005083 if (device == NULL) {
5084 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005085 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005086
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005087 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005088 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005089 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005090}
5091
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005092VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005093 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005094 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005095 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005096 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005097 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005098 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005099 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005100 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005101 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005102 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005103 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005104 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005105 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005106 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06005107 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005108 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005109 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005110 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005111 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005112 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005113 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005114 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06005115 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005116 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005117
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005118 if (instance == NULL) {
5119 return NULL;
5120 }
5121
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005122 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005123
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005124 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07005125 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005126 return fptr;
5127
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005128 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005129 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005130 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005131}